
<!DOCTYPE HTML>
<html lang="zh-hans" >
    <head>
        <meta charset="UTF-8">
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>模式详解 · Aivin开发笔记</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="">
        <meta name="generator" content="GitBook 3.2.3">
        <meta name="author" content="Aivin">
        
        
    
    <link rel="stylesheet" href="../../gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search-plus/search.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-fontsettings/website.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-tbfed-pagefooter/footer.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-local-video/video-js.min.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-splitter/splitter.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-highlight/website.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-theme-comscore/test.css">
                
            
        

    

    
        
        <link rel="stylesheet" href="../../styles/website.css">
        
    

        
    
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="mvc等.html" />
    
    
    <link rel="prev" href="设计模式.html" />
    

    
        <link rel="shortcut icon" href='../../assets/images/favicon.ico' type="image/x-icon">
    
    
        <link rel="bookmark" href='../../assets/images/favicon.ico' type="image/x-icon">
    
    
    

    </head>
    <body>
        
<div class="book">
    <div class="book-summary">
        
            
<div id="book-search-input" role="search">
    <input type="text" placeholder="输入并搜索" />
</div>

            
                <nav role="navigation">
                


<ul class="summary">
    
    

    

    
        
        
    
        <li class="chapter " data-level="1.1" data-path="../../">
            
                <a href="../../">
            
                    
                    首页
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="../doc/常用网站.html">
            
                <a href="../doc/常用网站.html">
            
                    
                    常用网站
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="../常用软件/常用软件和框架.html">
            
                <a href="../常用软件/常用软件和框架.html">
            
                    
                    常用软件和框架
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4" data-path="../doc/开发规范.html">
            
                <a href="../doc/开发规范.html">
            
                    
                    开发规范
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5" data-path="../doc/开源软件.html">
            
                <a href="../doc/开源软件.html">
            
                    
                    开源软件和框架
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6" data-path="../doc/Android常用代码.html">
            
                <a href="../doc/Android常用代码.html">
            
                    
                    Android常用代码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7" data-path="../源码阅读/源码阅读配置.html">
            
                <a href="../源码阅读/源码阅读配置.html">
            
                    
                    源码阅读
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.7.1" data-path="../源码阅读/其他框架源码.html">
            
                <a href="../源码阅读/其他框架源码.html">
            
                    
                    其他框架源码
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.8" data-path="../产品经理/产品经理.html">
            
                <a href="../产品经理/产品经理.html">
            
                    
                    产品经理
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9" data-path="设计模式.html">
            
                <a href="设计模式.html">
            
                    
                    设计模式
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.9.1" data-path="设计模式.html">
            
                <a href="设计模式.html">
            
                    
                    设计模式
            
                </a>
            

            
        </li>
    
        <li class="chapter active" data-level="1.9.2" data-path="模式详解.html">
            
                <a href="模式详解.html">
            
                    
                    模式详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.3" data-path="mvc等.html">
            
                <a href="mvc等.html">
            
                    
                    mvc等
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.10" data-path="../数据结构/常用数据结构.html">
            
                <a href="../数据结构/常用数据结构.html">
            
                    
                    基本算法
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.10.1" data-path="../数据结构/常用数据结构.html">
            
                <a href="../数据结构/常用数据结构.html">
            
                    
                    常用数据结构
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.2" data-path="../常用算法/算法术语.html">
            
                <a href="../常用算法/算法术语.html">
            
                    
                    算法术语
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.3" data-path="../常用算法/排序算法.html">
            
                <a href="../常用算法/排序算法.html">
            
                    
                    排序算法
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.4" data-path="../常用算法/查找算法.html">
            
                <a href="../常用算法/查找算法.html">
            
                    
                    查找算法
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.5" data-path="../常用算法/大数相加.html">
            
                <a href="../常用算法/大数相加.html">
            
                    
                    大数相加
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.6" data-path="../常用算法/集合的所有子集.html">
            
                <a href="../常用算法/集合的所有子集.html">
            
                    
                    获得集合的所有子集
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.7" data-path="../常用算法/扫描线种子填充算法.html">
            
                <a href="../常用算法/扫描线种子填充算法.html">
            
                    
                    扫描线种子填充算法
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.8" data-path="../常用算法/其他算法.html">
            
                <a href="../常用算法/其他算法.html">
            
                    
                    其他算法
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.11" data-path="../java基础/原码补码反码.html">
            
                <a href="../java基础/原码补码反码.html">
            
                    
                    Java部分
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.11.1" data-path="../java基础/原码补码反码.html">
            
                <a href="../java基础/原码补码反码.html">
            
                    
                    原码补码反码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.2" data-path="../java基础/java常用代码.html">
            
                <a href="../java基础/java常用代码.html">
            
                    
                    java常用代码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.3" data-path="../java基础/JVM详解.html">
            
                <a href="../java基础/JVM详解.html">
            
                    
                    JVM详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.4" data-path="../java基础/类加载机制.html">
            
                <a href="../java基础/类加载机制.html">
            
                    
                    类加载机制
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.5" data-path="../java基础/内存模型.html">
            
                <a href="../java基础/内存模型.html">
            
                    
                    内存模型
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.6" data-path="../java基础/GC机制.html">
            
                <a href="../java基础/GC机制.html">
            
                    
                    GC机制
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.7" data-path="../java基础/对象内存布局.html">
            
                <a href="../java基础/对象内存布局.html">
            
                    
                    对象内存布局
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.8" data-path="../java基础/继承多态.html">
            
                <a href="../java基础/继承多态.html">
            
                    
                    继承和多态
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.9" data-path="../java基础/相等判断.html">
            
                <a href="../java基础/相等判断.html">
            
                    
                    相等判断
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.10" data-path="../java基础/Java容器类.html">
            
                <a href="../java基础/Java容器类.html">
            
                    
                    Java容器类
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.11" data-path="../java基础/Java枚举.html">
            
                <a href="../java基础/Java枚举.html">
            
                    
                    Java枚举
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.12" data-path="../java基础/自定义异常.html">
            
                <a href="../java基础/自定义异常.html">
            
                    
                    自定义异常
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.13" data-path="../java基础/深度拷贝.html">
            
                <a href="../java基础/深度拷贝.html">
            
                    
                    深度拷贝
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.14" data-path="../java基础/泛型详解.html">
            
                <a href="../java基础/泛型详解.html">
            
                    
                    泛型详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.15" data-path="../java基础/线程详解.html">
            
                <a href="../java基础/线程详解.html">
            
                    
                    线程详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.16" data-path="../java基础/java注解.html">
            
                <a href="../java基础/java注解.html">
            
                    
                    注解详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.17" data-path="../java基础/数据解析.html">
            
                <a href="../java基础/数据解析.html">
            
                    
                    数据解析
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.18" data-path="../java基础/java8新特性.html">
            
                <a href="../java基础/java8新特性.html">
            
                    
                    Java8新特性
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.12" data-path="../android基础/android零散知识.html">
            
                <a href="../android基础/android零散知识.html">
            
                    
                    Android部分
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.12.1" data-path="../android基础/基础控件使用.html">
            
                <a href="../android基础/基础控件使用.html">
            
                    
                    基础控件使用
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.2" data-path="../android基础/android零散知识.html">
            
                <a href="../android基础/android零散知识.html">
            
                    
                    Android零散知识
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.3" data-path="../android基础/android坐标体系.html">
            
                <a href="../android基础/android坐标体系.html">
            
                    
                    Android坐标体系
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.4" data-path="../android基础/APP的启动流程.html">
            
                <a href="../android基础/APP的启动流程.html">
            
                    
                    APP启动流程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.5" data-path="../android基础/View加载流程.html">
            
                <a href="../android基础/View加载流程.html">
            
                    
                    View加载流程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.6" data-path="../android基础/事件分发机制.html">
            
                <a href="../android基础/事件分发机制.html">
            
                    
                    事件分发机制
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.7" data-path="../android基础/控件绘制流程.html">
            
                <a href="../android基础/控件绘制流程.html">
            
                    
                    控件绘制流程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.8" data-path="../android基础/常用shape.html">
            
                <a href="../android基础/常用shape.html">
            
                    
                    常用shape
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.9" data-path="../android基础/进程通信.html">
            
                <a href="../android基础/进程通信.html">
            
                    
                    进程通信
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.10" data-path="../通信方式/通信方式详解.html">
            
                <a href="../通信方式/通信方式详解.html">
            
                    
                    通信方式详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.11" data-path="../android基础/Binder详解.html">
            
                <a href="../android基础/Binder详解.html">
            
                    
                    Binder详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.12" data-path="../android基础/Handler详解.html">
            
                <a href="../android基础/Handler详解.html">
            
                    
                    Handle详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.13" data-path="../android基础/Fragment详解.html">
            
                <a href="../android基础/Fragment详解.html">
            
                    
                    Fragment详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.14" data-path="../android基础/Activity详解.html">
            
                <a href="../android基础/Activity详解.html">
            
                    
                    Activity详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.15" data-path="../android基础/BroadcastReceiver.html">
            
                <a href="../android基础/BroadcastReceiver.html">
            
                    
                    BroadcastReceiver详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.16" data-path="../android基础/Service服务.html">
            
                <a href="../android基础/Service服务.html">
            
                    
                    Service详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.17" data-path="../android基础/动画详解.html">
            
                <a href="../android基础/动画详解.html">
            
                    
                    动画详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.18" data-path="../android基础/屏幕刷新机制.html">
            
                <a href="../android基础/屏幕刷新机制.html">
            
                    
                    屏幕刷新机制
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.19" data-path="../android基础/屏幕适配.html">
            
                <a href="../android基础/屏幕适配.html">
            
                    
                    屏幕适配
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.20" data-path="../android基础/图片加载详解.html">
            
                <a href="../android基础/图片加载详解.html">
            
                    
                    图片加载详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.21" data-path="../android基础/WebView详解.html">
            
                <a href="../android基础/WebView详解.html">
            
                    
                    WebView详解
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.22" data-path="../android基础/沉浸式.html">
            
                <a href="../android基础/沉浸式.html">
            
                    
                    沉浸式
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.23" data-path="../android基础/相机模块.html">
            
                <a href="../android基础/相机模块.html">
            
                    
                    相机模块
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.24" data-path="../android基础/地图模块.html">
            
                <a href="../android基础/地图模块.html">
            
                    
                    地图模块
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.25" data-path="../android基础/Androidstudio插件开发.html">
            
                <a href="../android基础/Androidstudio插件开发.html">
            
                    
                    Androidstudio插件开发
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.26" data-path="../android基础/Apk插件化开发.html">
            
                <a href="../android基础/Apk插件化开发.html">
            
                    
                    Apk插件化开发
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.27" data-path="../android基础/App组件化开发.html">
            
                <a href="../android基础/App组件化开发.html">
            
                    
                    App组件化开发
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.28" data-path="../android基础/sdk开发.html">
            
                <a href="../android基础/sdk开发.html">
            
                    
                    sdk开发
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.29" data-path="../android基础/APP优化.html">
            
                <a href="../android基础/APP优化.html">
            
                    
                    APP优化
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.30" data-path="../android基础/项目参数配置.html">
            
                <a href="../android基础/项目参数配置.html">
            
                    
                    项目参数配置
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.31" data-path="../android基础/App发布.html">
            
                <a href="../android基础/App发布.html">
            
                    
                    App发布
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.32" data-path="../android基础/Android外挂.html">
            
                <a href="../android基础/Android外挂.html">
            
                    
                    Android外挂
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.33" data-path="../android基础/Android字节码插桩.html">
            
                <a href="../android基础/Android字节码插桩.html">
            
                    
                    Android字节码插桩
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.34" data-path="../android基础/智能家居.html">
            
                <a href="../android基础/智能家居.html">
            
                    
                    智能家居
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.13" data-path="../python/python基础.html">
            
                <a href="../python/python基础.html">
            
                    
                    python部分
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.13.1" data-path="../python/python基础.html">
            
                <a href="../python/python基础.html">
            
                    
                    python基础
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.13.2" data-path="../python/python爬虫.html">
            
                <a href="../python/python爬虫.html">
            
                    
                    python爬虫
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.14" data-path="../gradle/Groovy.html">
            
                <a href="../gradle/Groovy.html">
            
                    
                    Groovy
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.15" data-path="../kotlin/kotlin部分.html">
            
                <a href="../kotlin/kotlin部分.html">
            
                    
                    kotlin部分
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.16" data-path="../flutter/flutter部分.html">
            
                <a href="../flutter/flutter部分.html">
            
                    
                    flutter部分
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17" data-path="../native/ccpp.html">
            
                <a href="../native/ccpp.html">
            
                    
                    native部分
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.17.1" data-path="../native/Linux.html">
            
                <a href="../native/Linux.html">
            
                    
                    Linux
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.2" data-path="../native/ccpp.html">
            
                <a href="../native/ccpp.html">
            
                    
                    cCpp
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.3" data-path="../native/NDK.html">
            
                <a href="../native/NDK.html">
            
                    
                    NDK
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.4" data-path="../native/系统编译剪裁.html">
            
                <a href="../native/系统编译剪裁.html">
            
                    
                    系统编译剪裁
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.5" data-path="../native/音视频.html">
            
                <a href="../native/音视频.html">
            
                    
                    音视频
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.6" data-path="../native/音视频第三方库.html">
            
                <a href="../native/音视频第三方库.html">
            
                    
                    音视频第三方库
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.7" data-path="../native/相关代码.html">
            
                <a href="../native/相关代码.html">
            
                    
                    相关代码
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.18" data-path="../server/服务器部分.html">
            
                <a href="../server/服务器部分.html">
            
                    
                    服务器部分
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.19" data-path="../webDev/web部分.html">
            
                <a href="../webDev/web部分.html">
            
                    
                    web部分
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.20" data-path="../人工智能/人工智能相关概念.html">
            
                <a href="../人工智能/人工智能相关概念.html">
            
                    
                    人工智能
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.21" data-path="../面试真题/极飞.html">
            
                <a href="../面试真题/极飞.html">
            
                    
                    面试真题
            
                </a>
            

            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
            本书使用 GitBook 发布
        </a>
    </li>
</ul>


                </nav>
            
        
    </div>

    <div class="book-body">
        
            <div class="body-inner">
                
                    

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href="../.." >模式详解</a>
    </h1>
</div>




                    <div class="page-wrapper" tabindex="-1" role="main">
                        <div class="page-inner">
                            
<div class="search-plus" id="book-search-results">
    <div class="search-noresults">
    
                                <section class="normal markdown-section">
                                
                                <div id="anchor-navigation-ex-navbar"><i class="fa fa-navicon"></i><ul><li><span class="title-icon "></span><a href="#android&#x4E2D;-&#x5E38;&#x7528;&#x7684;&#x8BBE;&#x8BA1;&#x6A21;&#x5F0F;"><b>1. </b>Android&#x4E2D; &#x5E38;&#x7528;&#x7684;&#x8BBE;&#x8BA1;&#x6A21;&#x5F0F;</a></li><li><span class="title-icon "></span><a href="#&#x56DE;&#x8C03;&#x673A;&#x5236;"><b>2. </b>&#x56DE;&#x8C03;&#x673A;&#x5236;</a></li><ul><li><span class="title-icon "></span><a href="#interface-&#x5B9E;&#x73B0;&#x56DE;&#x8C03;"><b>2.1. </b>interface &#x5B9E;&#x73B0;&#x56DE;&#x8C03;</a></li><li><span class="title-icon "></span><a href="#&#x56DE;&#x8C03;&#x6548;&#x679C;---&#x533F;&#x540D;&#x5B50;&#x7C7B;&#x5B9E;&#x73B0;"><b>2.2. </b>&#x56DE;&#x8C03;&#x6548;&#x679C; - &#x533F;&#x540D;&#x5B50;&#x7C7B;&#x5B9E;&#x73B0;</a></li></ul><li><span class="title-icon "></span><a href="#&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x8BBE;&#x8BA1;&#x539F;&#x5219;"><b>3. </b>&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x8BBE;&#x8BA1;&#x539F;&#x5219;</a></li><ul><li><span class="title-icon "></span><a href="#&#x5355;&#x4E00;&#x804C;&#x8D23;"><b>3.1. </b>&#x5355;&#x4E00;&#x804C;&#x8D23;</a></li><ul><li><span class="title-icon "></span><a href="#&#x9AD8;&#x5185;&#x805A;&#x3001;&#x4F4E;&#x8026;&#x5408;"><b>3.1.1. </b>&#x9AD8;&#x5185;&#x805A;&#x3001;&#x4F4E;&#x8026;&#x5408;</a></li></ul><li><span class="title-icon "></span><a href="#&#x5F00;&#x95ED;&#x539F;&#x5219;"><b>3.2. </b>&#x5F00;&#x95ED;&#x539F;&#x5219;</a></li><li><span class="title-icon "></span><a href="#&#x63A5;&#x53E3;&#x9694;&#x79BB;&#x539F;&#x5219;"><b>3.3. </b>&#x63A5;&#x53E3;&#x9694;&#x79BB;&#x539F;&#x5219;</a></li><li><span class="title-icon "></span><a href="#&#x4F9D;&#x8D56;&#x5012;&#x8F6C;&#x539F;&#x5219;"><b>3.4. </b>&#x4F9D;&#x8D56;&#x5012;&#x8F6C;&#x539F;&#x5219;</a></li><ul><li><span class="title-icon "></span><a href="#&#x4F9D;&#x8D56;&#x5012;&#x7F6E;&#x548C;&#x91CC;&#x6C0F;&#x66FF;&#x6362;&#x7684;&#x533A;&#x522B;"><b>3.4.1. </b>&#x4F9D;&#x8D56;&#x5012;&#x7F6E;&#x548C;&#x91CC;&#x6C0F;&#x66FF;&#x6362;&#x7684;&#x533A;&#x522B;</a></li></ul><li><span class="title-icon "></span><a href="#&#x91CC;&#x6C0F;&#x4EE3;&#x6362;&#x539F;&#x5219;"><b>3.5. </b>&#x91CC;&#x6C0F;&#x4EE3;&#x6362;&#x539F;&#x5219;</a></li><li><span class="title-icon "></span><a href="#&#x8FEA;&#x7C73;&#x7279;&#x6CD5;&#x5219;-&#x3001;&#x5F97;&#x58A8;&#x5FD2;&#x8033;&#x6CD5;&#x5219;"><b>3.6. </b>&#x8FEA;&#x7C73;&#x7279;&#x6CD5;&#x5219; &#x3001;&#x5F97;&#x58A8;&#x5FD2;&#x8033;&#x6CD5;&#x5219;</a></li><li><span class="title-icon "></span><a href="#&#x5408;&#x6210;&#x590D;&#x7528;&#x539F;&#x5219;"><b>3.7. </b>&#x5408;&#x6210;&#x590D;&#x7528;&#x539F;&#x5219;</a></li></ul><li><span class="title-icon "></span><a href="#&#x4E2D;&#x4ECB;&#x8005;&#x6A21;&#x5F0F;"><b>4. </b>&#x4E2D;&#x4ECB;&#x8005;&#x6A21;&#x5F0F;</a></li><ul><li><span class="title-icon "></span><a href="#&#x5E94;&#x7528;&#x573A;&#x666F;"><b>4.1. </b>&#x5E94;&#x7528;&#x573A;&#x666F;</a></li><li><span class="title-icon "></span><a href="#&#x4F18;&#x7F3A;&#x70B9;"><b>4.2. </b>&#x4F18;&#x7F3A;&#x70B9;</a></li></ul><li><span class="title-icon "></span><a href="#&#x4EAB;&#x5143;&#x6A21;&#x5F0F;"><b>5. </b>&#x4EAB;&#x5143;&#x6A21;&#x5F0F;</a></li><ul><li><span class="title-icon "></span><a href="#&#x7F3A;&#x70B9;"><b>5.1. </b>&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#&#x793A;&#x4F8B;"><b>5.2. </b>&#x793A;&#x4F8B;</a></li></ul><li><span class="title-icon "></span><a href="#&#x4EE3;&#x7406;&#x6A21;&#x5F0F;"><b>6. </b>&#x4EE3;&#x7406;&#x6A21;&#x5F0F;</a></li><ul><li><span class="title-icon "></span><a href="#&#x9759;&#x6001;&#x4EE3;&#x7406;"><b>6.1. </b>&#x9759;&#x6001;&#x4EE3;&#x7406;</a></li><li><span class="title-icon "></span><a href="#&#x52A8;&#x6001;&#x4EE3;&#x7406;"><b>6.2. </b>&#x52A8;&#x6001;&#x4EE3;&#x7406;</a></li><li><span class="title-icon "></span><a href="#cglib-&#x52A8;&#x6001;&#x4EE3;&#x7406;"><b>6.3. </b>cglib &#x52A8;&#x6001;&#x4EE3;&#x7406;</a></li><li><span class="title-icon "></span><a href="#&#x4EE3;&#x7406;&#x6A21;&#x5F0F;&#x548C;&#x63A5;&#x53E3;&#x56DE;&#x8C03;&#x7684;&#x533A;&#x522B;"><b>6.4. </b>&#x4EE3;&#x7406;&#x6A21;&#x5F0F;&#x548C;&#x63A5;&#x53E3;&#x56DE;&#x8C03;&#x7684;&#x533A;&#x522B;</a></li></ul><li><span class="title-icon "></span><a href="#&#x5355;&#x4F8B;&#x6A21;&#x5F0F;--singleton-pattern"><b>7. </b>&#x5355;&#x4F8B;&#x6A21;&#x5F0F;  Singleton Pattern</a></li><ul><li><span class="title-icon "></span><a href="#&#x4F7F;&#x7528;&#x573A;&#x666F;"><b>7.1. </b>&#x4F7F;&#x7528;&#x573A;&#x666F;</a></li><li><span class="title-icon "></span><a href="#&#x7F3A;&#x70B9;_1"><b>7.2. </b>&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#&#x997F;&#x6C49;&#x5F0F;-&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x4E0D;&#x63A8;&#x8350;&#xFF0C;&#x6709;&#x5E76;&#x53D1;&#x95EE;&#x9898;"><b>7.3. </b>&#x997F;&#x6C49;&#x5F0F; &#x5355;&#x4F8B;&#x6A21;&#x5F0F; (&#x4E0D;&#x63A8;&#x8350;&#xFF0C;&#x6709;&#x5E76;&#x53D1;&#x95EE;&#x9898;)</a></li><li><span class="title-icon "></span><a href="#&#x7B80;&#x5355;-&#x61D2;&#x6C49;&#x5F0F;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x4E0D;&#x63A8;&#x8350;-&#xFF0C;&#x6548;&#x7387;&#x4E0D;&#x9AD8;"><b>7.4. </b>&#x7B80;&#x5355; &#x61D2;&#x6C49;&#x5F0F;&#x5355;&#x4F8B;&#x6A21;&#x5F0F; (&#x4E0D;&#x63A8;&#x8350; &#xFF0C;&#x6548;&#x7387;&#x4E0D;&#x9AD8;)</a></li><li><span class="title-icon "></span><a href="#dcl---volatile--&#x61D2;&#x6C49;&#x6A21;&#x5F0F;-&#x63A8;&#x8350;"><b>7.5. </b>DCL  + Volatile  &#x61D2;&#x6C49;&#x6A21;&#x5F0F; (&#x63A8;&#x8350;)</a></li><li><span class="title-icon "></span><a href="#holder-&#x61D2;&#x6C49;&#x6A21;&#x5F0F;-&#x63A8;&#x8350;"><b>7.6. </b>Holder &#x61D2;&#x6C49;&#x6A21;&#x5F0F; (&#x63A8;&#x8350;)</a></li><li><span class="title-icon "></span><a href="#&#x679A;&#x4E3E;-&#x61D2;&#x6C49;&#x6A21;&#x5F0F;"><b>7.7. </b>&#x679A;&#x4E3E; &#x61D2;&#x6C49;&#x6A21;&#x5F0F;</a></li><li><span class="title-icon "></span><a href="#&#x7C7B;&#x7684;&#x9759;&#x6001;&#x65B9;&#x6CD5;&#x4E5F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;"><b>7.8. </b>&#x7C7B;&#x7684;&#x9759;&#x6001;&#x65B9;&#x6CD5;&#x4E5F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;</a></li><li><span class="title-icon "></span><a href="#&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x53CD;&#x5E8F;&#x5217;&#x5316;-&#x7684;&#x95EE;&#x9898;"><b>7.9. </b>&#x5355;&#x4F8B;&#x6A21;&#x5F0F; &#x53CD;&#x5E8F;&#x5217;&#x5316; &#x7684;&#x95EE;&#x9898;</a></li></ul><li><span class="title-icon "></span><a href="#&#x539F;&#x578B;&#x6A21;&#x5F0F;"><b>8. </b>&#x539F;&#x578B;&#x6A21;&#x5F0F;</a></li><ul><li><span class="title-icon "></span><a href="#&#x7F3A;&#x70B9;_2"><b>8.1. </b>&#x7F3A;&#x70B9;</a></li></ul><li><span class="title-icon "></span><a href="#&#x547D;&#x4EE4;&#x6A21;&#x5F0F;-command-pattern"><b>9. </b>&#x547D;&#x4EE4;&#x6A21;&#x5F0F; Command Pattern</a></li><ul><li><span class="title-icon "></span><a href="#&#x793A;&#x4F8B;_1"><b>9.1. </b>&#x793A;&#x4F8B;</a></li><li><span class="title-icon "></span><a href="#&#x4F18;&#x7F3A;&#x70B9;_1"><b>9.2. </b>&#x4F18;&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#&#x547D;&#x4EE4;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><b>9.3. </b>&#x547D;&#x4EE4;&#x6A21;&#x5F0F; &#x548C; &#x7B56;&#x7565;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</a></li></ul><li><span class="title-icon "></span><a href="#&#x5907;&#x5FD8;&#x5F55;&#x6A21;&#x5F0F;--memento-pattern--&#x3001;&#x5FEB;&#x7167;&#x6A21;&#x5F0F;"><b>10. </b>&#x5907;&#x5FD8;&#x5F55;&#x6A21;&#x5F0F;  Memento Pattern  &#x3001;&#x5FEB;&#x7167;&#x6A21;&#x5F0F;</a></li><li><span class="title-icon "></span><a href="#&#x5916;&#x89C2;&#x6A21;&#x5F0F;--facade-pattern-&#x3001;&#x95E8;&#x9762;&#x6A21;&#x5F0F;"><b>11. </b>&#x5916;&#x89C2;&#x6A21;&#x5F0F;  Facade Pattern &#x3001;&#x95E8;&#x9762;&#x6A21;&#x5F0F;</a></li><ul><li><span class="title-icon "></span><a href="#&#x7F3A;&#x70B9;_3"><b>11.1. </b>&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#&#x4EE3;&#x7406;&#x6A21;&#x5F0F;-&#x3001;&#x5916;&#x89C2;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><b>11.2. </b>&#x4EE3;&#x7406;&#x6A21;&#x5F0F; &#x3001;&#x5916;&#x89C2;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</a></li></ul><li><span class="title-icon "></span><a href="#&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-builder-pattern"><b>12. </b>&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F; Builder Pattern</a></li><ul><li><span class="title-icon "></span><a href="#&#x5177;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#xFF08;&#x5B8C;&#x6574;&#x6A21;&#x5F0F;&#xFF09;"><b>12.1. </b>&#x5177;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F; &#xFF08;&#x5B8C;&#x6574;&#x6A21;&#x5F0F;&#xFF09;</a></li><li><span class="title-icon "></span><a href="#&#x6CA1;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;&#xFF08;&#x7B80;&#x7565;&#x6A21;&#x5F0F;&#xFF09;"><b>12.2. </b>&#x6CA1;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;&#xFF08;&#x7B80;&#x7565;&#x6A21;&#x5F0F;&#xFF09;</a></li><li><span class="title-icon "></span><a href="#&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x5DE5;&#x5382;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><b>12.3. </b>&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F; &#x548C; &#x5DE5;&#x5382;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</a></li><li><span class="title-icon "></span><a href="#&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><b>12.4. </b>&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F; &#x548C; &#x7B56;&#x7565;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</a></li></ul><li><span class="title-icon "></span><a href="#&#x6865;&#x63A5;&#x6A21;&#x5F0F;-bridge-pattern"><b>13. </b>&#x6865;&#x63A5;&#x6A21;&#x5F0F; Bridge Pattern</a></li><ul><li><span class="title-icon "></span><a href="#&#x62BD;&#x8C61;&#x90E8;&#x5206;-&#x3001;&#x5B9E;&#x73B0;&#x90E8;&#x5206;"><b>13.1. </b>&#x62BD;&#x8C61;&#x90E8;&#x5206; &#x3001;&#x5B9E;&#x73B0;&#x90E8;&#x5206;</a></li><li><span class="title-icon "></span><a href="#&#x793A;&#x610F;&#x56FE;"><b>13.2. </b>&#x793A;&#x610F;&#x56FE;</a></li><li><span class="title-icon "></span><a href="#demo"><b>13.3. </b>demo</a></li></ul><li><span class="title-icon "></span><a href="#&#x6A21;&#x677F;&#x6A21;&#x5F0F;-&#x3001;&#x6A21;&#x677F;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;-&#x3001;template-method-pattern"><b>14. </b>&#x6A21;&#x677F;&#x6A21;&#x5F0F; &#x3001;&#x6A21;&#x677F;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F; &#x3001;Template Method Pattern</a></li><ul><li><span class="title-icon "></span><a href="#demo_1"><b>14.1. </b>demo</a></li></ul><li><span class="title-icon "></span><a href="#&#x72B6;&#x6001;&#x6A21;&#x5F0F;-state-pattern"><b>15. </b>&#x72B6;&#x6001;&#x6A21;&#x5F0F; State Pattern</a></li><ul><li><span class="title-icon "></span><a href="#demo_2"><b>15.1. </b>demo</a></li><li><span class="title-icon "></span><a href="#&#x7F3A;&#x70B9;_4"><b>15.2. </b>&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x548C;-&#x72B6;&#x6001;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><b>15.3. </b>&#x7B56;&#x7565;&#x6A21;&#x5F0F; &#x548C; &#x72B6;&#x6001;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</a></li></ul><li><span class="title-icon "></span><a href="#&#x7B56;&#x7565;&#x6A21;&#x5F0F;--strategy-pattern"><b>16. </b>&#x7B56;&#x7565;&#x6A21;&#x5F0F;  Strategy Pattern</a></li><ul><li><span class="title-icon "></span><a href="#demo_3"><b>16.1. </b>demo</a></li><li><span class="title-icon "></span><a href="#&#x4F18;&#x7F3A;&#x70B9;_2"><b>16.2. </b>&#x4F18;&#x7F3A;&#x70B9;</a></li></ul><li><span class="title-icon "></span><a href="#&#x7B80;&#x5355;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;simple-factory-pattern&#xFF09;"><b>17. </b>&#x7B80;&#x5355;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;Simple Factory Pattern&#xFF09;</a></li><ul><li><span class="title-icon "></span><a href="#&#x4F18;&#x7F3A;&#x70B9;_3"><b>17.1. </b>&#x4F18;&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#demo_4"><b>17.2. </b>demo</a></li></ul><li><span class="title-icon "></span><a href="#&#x62BD;&#x8C61;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;abstract-factory-pattern&#xFF09;"><b>18. </b>&#x62BD;&#x8C61;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;Abstract Factory Pattern&#xFF09;</a></li><ul><li><span class="title-icon "></span><a href="#&#x4EA7;&#x54C1;&#x7B49;&#x7EA7;&#x7ED3;&#x6784;-&#x3001;&#x4EA7;&#x54C1;&#x65CF;"><b>18.1. </b>&#x4EA7;&#x54C1;&#x7B49;&#x7EA7;&#x7ED3;&#x6784; &#x3001;&#x4EA7;&#x54C1;&#x65CF;</a></li><li><span class="title-icon "></span><a href="#&#x4F18;&#x7F3A;&#x70B9;_4"><b>18.2. </b>&#x4F18;&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#demo_5"><b>18.3. </b>demo</a></li></ul><li><span class="title-icon "></span><a href="#&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;&#xFF08;factory-method-pattern&#xFF09;"><b>19. </b>&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;&#xFF08;Factory Method Pattern&#xFF09;</a></li><ul><li><span class="title-icon "></span><a href="#&#x4F18;&#x7F3A;&#x70B9;_5"><b>19.1. </b>&#x4F18;&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x548C;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;"><b>19.2. </b>&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x548C;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;</a></li></ul><li><span class="title-icon "></span><a href="#&#x7EC4;&#x5408;&#x6A21;&#x5F0F;-composite-pattern-&#x3001;-&#x6574;&#x4F53;-&#x90E8;&#x5206;&#x6A21;&#x5F0F;"><b>20. </b>&#x7EC4;&#x5408;&#x6A21;&#x5F0F; Composite Pattern &#x3001; &#x6574;&#x4F53;-&#x90E8;&#x5206;&#x6A21;&#x5F0F;</a></li><ul><li><span class="title-icon "></span><a href="#&#x900F;&#x660E;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;-&#xFF08;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#xFF09;"><b>20.1. </b>&#x900F;&#x660E;&#x7EC4;&#x5408;&#x6A21;&#x5F0F; &#xFF08;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#xFF09;</a></li><li><span class="title-icon "></span><a href="#&#x5B89;&#x5168;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;"><b>20.2. </b>&#x5B89;&#x5168;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;</a></li><li><span class="title-icon "></span><a href="#&#x4F18;&#x70B9;"><b>20.3. </b>&#x4F18;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#demo_6"><b>20.4. </b>demo</a></li></ul><li><span class="title-icon "></span><a href="#&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F;-&#x3001;decorator-pattern-&#x3001;&#x5305;&#x88C5;&#x6A21;&#x5F0F;--&#x3001;wrapper-pattern"><b>21. </b>&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F; &#x3001;Decorator Pattern &#x3001;&#x5305;&#x88C5;&#x6A21;&#x5F0F;  &#x3001;Wrapper Pattern</a></li><ul><li><span class="title-icon "></span><a href="#&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;-&#x5C3D;&#x91CF;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;"><b>21.1. </b>&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F; (&#x5C3D;&#x91CF;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;)</a></li><li><span class="title-icon "></span><a href="#&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;"><b>21.2. </b>&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;</a></li><li><span class="title-icon "></span><a href="#&#x5982;&#x4F55;&#x7406;&#x89E3;-&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;&#x4E0D;&#x80FD;&#x5B9E;&#x73B0;&#x5BF9;&#x540C;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;&#x591A;&#x6B21;&#x88C5;&#x9970;"><b>21.3. </b>&#x5982;&#x4F55;&#x7406;&#x89E3; &#x201C;&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;&#x4E0D;&#x80FD;&#x5B9E;&#x73B0;&#x5BF9;&#x540C;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;&#x591A;&#x6B21;&#x88C5;&#x9970;&#x201D;</a></li><li><span class="title-icon "></span><a href="#&#x4EE3;&#x7406;&#x6A21;&#x5F0F;-&#x4E0E;-&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F;-&#x533A;&#x522B;"><b>21.4. </b>&#x4EE3;&#x7406;&#x6A21;&#x5F0F; &#x4E0E; &#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F; &#x533A;&#x522B;</a></li></ul><li><span class="title-icon "></span><a href="#&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;--observer-pattern"><b>22. </b>&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;  Observer Pattern</a></li><ul><li><span class="title-icon "></span><a href="#&#x89C2;&#x5BDF;&#x76EE;&#x6807;"><b>22.1. </b>&#x89C2;&#x5BDF;&#x76EE;&#x6807;</a></li><li><span class="title-icon "></span><a href="#&#x89C2;&#x5BDF;&#x8005;"><b>22.2. </b>&#x89C2;&#x5BDF;&#x8005;</a></li><li><span class="title-icon "></span><a href="#&#x4F18;&#x7F3A;&#x70B9;_6"><b>22.3. </b>&#x4F18;&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#demo_7"><b>22.4. </b>demo:</a></li></ul><li><span class="title-icon "></span><a href="#&#x89E3;&#x91CA;&#x5668;&#x6A21;&#x5F0F;-interpreter-pattern"><b>23. </b>&#x89E3;&#x91CA;&#x5668;&#x6A21;&#x5F0F; Interpreter Pattern</a></li><li><span class="title-icon "></span><a href="#&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;--visitor-pattern"><b>24. </b>&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;  Visitor Pattern</a></li><ul><li><span class="title-icon "></span><a href="#demo_8"><b>24.1. </b>demo</a></li><li><span class="title-icon "></span><a href="#&#x4F18;&#x7F3A;&#x70B9;_7"><b>24.2. </b>&#x4F18;&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><b>24.3. </b>&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F; &#x548C; &#x7B56;&#x7565;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</a></li></ul><li><span class="title-icon "></span><a href="#&#x8D23;&#x4EFB;&#x94FE;&#x6A21;&#x5F0F;"><b>25. </b>&#x8D23;&#x4EFB;&#x94FE;&#x6A21;&#x5F0F;</a></li><ul><li><span class="title-icon "></span><a href="#&#x4F18;&#x7F3A;&#x70B9;_8"><b>25.1. </b>&#x4F18;&#x7F3A;&#x70B9;</a></li><li><span class="title-icon "></span><a href="#demo_9"><b>25.2. </b>demo</a></li></ul><li><span class="title-icon "></span><a href="#&#x8FED;&#x4EE3;&#x5668;&#x6A21;&#x5F0F;-iterator-pattern-&#x3001;&#x6E38;&#x6807;&#x6A21;&#x5F0F;"><b>26. </b>&#x8FED;&#x4EE3;&#x5668;&#x6A21;&#x5F0F; Iterator Pattern &#x3001;&#x6E38;&#x6807;&#x6A21;&#x5F0F;</a></li><ul><li><span class="title-icon "></span><a href="#demo_10"><b>26.1. </b>demo</a></li><li><span class="title-icon "></span><a href="#&#x4F18;&#x7F3A;&#x70B9;_9"><b>26.2. </b>&#x4F18;&#x7F3A;&#x70B9;</a></li></ul><li><span class="title-icon "></span><a href="#&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;--adapter-pattern"><b>27. </b>&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;  Adapter Pattern</a></li><ul><li><span class="title-icon "></span><a href="#&#x4E00;&#x3001;&#x7C7B;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;"><b>27.1. </b>&#x4E00;&#x3001;&#x7C7B;&#x9002;&#x914D;&#x5668; &#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;</a></li><li><span class="title-icon "></span><a href="#&#x4E8C;&#x3001;&#x5BF9;&#x8C61;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x63A8;&#x8350;&#xFF09;"><b>27.2. </b>&#x4E8C;&#x3001;&#x5BF9;&#x8C61;&#x9002;&#x914D;&#x5668; &#xFF08;&#x63A8;&#x8350;&#xFF09;</a></li><li><span class="title-icon "></span><a href="#&#x4E09;&#x3001;&#x7F3A;&#x7701;&#x9002;&#x914D;&#x5668;-&#x3001;&#x63A5;&#x53E3;&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;&#xFF08;&#x63A8;&#x8350;&#xFF09;"><b>27.3. </b>&#x4E09;&#x3001;&#x7F3A;&#x7701;&#x9002;&#x914D;&#x5668; &#x3001;&#x63A5;&#x53E3;&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;&#xFF08;&#x63A8;&#x8350;&#xFF09;</a></li><li><span class="title-icon "></span><a href="#&#x56DB;&#x3001;&#x53CC;&#x5411;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;"><b>27.4. </b>&#x56DB;&#x3001;&#x53CC;&#x5411;&#x9002;&#x914D;&#x5668; &#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;</a></li></ul></ul></div><a href="#android&#x4E2D;-&#x5E38;&#x7528;&#x7684;&#x8BBE;&#x8BA1;&#x6A21;&#x5F0F;" id="anchorNavigationExGoTop"><i class="fa fa-arrow-up"></i></a><h1 id="android&#x4E2D;-&#x5E38;&#x7528;&#x7684;&#x8BBE;&#x8BA1;&#x6A21;&#x5F0F;"><a name="android&#x4E2D;-&#x5E38;&#x7528;&#x7684;&#x8BBE;&#x8BA1;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#android&#x4E2D;-&#x5E38;&#x7528;&#x7684;&#x8BBE;&#x8BA1;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>1. Android&#x4E2D; &#x5E38;&#x7528;&#x7684;&#x8BBE;&#x8BA1;&#x6A21;&#x5F0F;</h1>
<pre><code class="lang-text">&#x5355;&#x4F8B;&#x6A21;&#x5F0F; // 
&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F; Builder //   AlertDialog.Builder
&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;  // Rxjava &#xFF0C;
&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F; // &#x89E3;&#x51B3;&#x63A5;&#x53E3;&#x4E0D;&#x517C;&#x5BB9;&#x7684;&#x95EE;&#x9898; &#xFF0C;&#x4E24;&#x4E2A;&#x7CFB;&#x7EDF;&#x7684;&#x63A5;&#x53E3;&#x4E0D;&#x4E00;&#x6837;&#xFF0C;&#x6211;&#x7EE7;&#x627F;&#x65E7;&#x63A5;&#x53E3;,&#x7136;&#x540E;...
&#x4EE3;&#x7406;&#x6A21;&#x5F0F;  // &#x6E90;&#x7801;&#x4E2D; &#x6709;&#x5927;&#x91CF;&#x7528;&#x5230; ActivityManagerProxy , AMS  

// AsyncTask &#x5E94;&#x7528; &#x6A21;&#x677F;&#x65B9;&#x6CD5;   
@MainThread
public final AsyncTask&lt;Params, Progress, Result&gt; execute(Params... params){
    return executeOnExecutor(sDefaultExecutor, params);
}
@MainThread
public final AsyncTask&lt;Params, Progress, Result&gt; executeOnExecutor(
Executor exec, Params... params){
    ...
    onPreExecute();
    ...
    exec.execute(mFuture);
    return this;
}
</code></pre>
<h1 id="&#x56DE;&#x8C03;&#x673A;&#x5236;"><a name="&#x56DE;&#x8C03;&#x673A;&#x5236;" class="anchor-navigation-ex-anchor" href="#&#x56DE;&#x8C03;&#x673A;&#x5236;"><i class="fa fa-link" aria-hidden="true"></i></a>2. &#x56DE;&#x8C03;&#x673A;&#x5236;</h1>
<h2 id="interface-&#x5B9E;&#x73B0;&#x56DE;&#x8C03;"><a name="interface-&#x5B9E;&#x73B0;&#x56DE;&#x8C03;" class="anchor-navigation-ex-anchor" href="#interface-&#x5B9E;&#x73B0;&#x56DE;&#x8C03;"><i class="fa fa-link" aria-hidden="true"></i></a>2.1. interface &#x5B9E;&#x73B0;&#x56DE;&#x8C03;</h2>
<pre><code class="lang-text">&#x56DE;&#x8C03;&#x7684;&#x7B80;&#x5355;&#x7406;&#x89E3;&#xFF1A;
A&#x9700;&#x8981;&#x505A;&#x4E00;&#x4EF6;&#x4E8B;&#x60C5;(&#x4E0D;&#x9700;&#x8981;&#x7ACB;&#x523B;&#x77E5;&#x9053;&#x7ED3;&#x679C;)&#xFF0C;&#x7ED9;B&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x56DE;&#x8C03;&#x5BF9;&#x8C61;&#xFF0C;&#x7136;&#x540E;B&#x5728;&#x6761;&#x4EF6;&#x5408;&#x9002;&#x7684;&#x65F6;&#x5019;&#x6267;&#x884C;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x7ED3;&#x679C;&#xFF0C; 
&#x7136;&#x540E;&#x901A;&#x8FC7;A&#x4F20;&#x8FC7;&#x6765;&#x7684;&#x56DE;&#x8C03;&#x5BF9;&#x8C61;&#x544A;&#x8BC9;A&#x3002;

// 1&#x3001;&#x56DE;&#x8C03;&#x666E;&#x901A;&#x4F7F;&#x7528;
public interface IH264StoreFinishCallBack{
    public void onStoreAndParseFinished( boolean result, String msgStr) ;
}
private IH264StoreFinishCallBack ih264StoreFinishCallBack = new IH264StoreFinishCallBack(){
    @Override
    public void onStoreAndParseFinished(boolean result, String msgStr)  {
        if(result) {
            disMissIosLoading();
        }
    }
} ;
H264FileSotrPresenter h264FileSotrPresenter = new H264FileSotrPresenter(ih264StoreFinishCallBack);
if(ih264StoreFinishCallBack!=null){
 ih264StoreFinishCallBack.onStoreAndParseFinished(true ,&quot;&#x5207;&#x6362;&#x5230;&#x7167;&#x7247;&#x65F6;&#x81EA;&#x52A8;&#x89E6;&#x53D1;&#x7ED3;&#x675F;&#x5F55;&#x50CF;&#x547D;&#x4EE4;&quot;);
}

//  2&#x3001;&#x5168;&#x5C40;&#x56DE;&#x8C03;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x6CD5;(&#x7ED3;&#x5408;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;)
&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5728;&#x4E0D;&#x540C;&#x7684;activity&#x4E4B;&#x95F4;&#x4F20;&#x9012;&#x53C2;&#x6570;&#x3002;
1&#x3001;&#x5B9A;&#x4E49;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7BA1;&#x7406;&#x7C7B;&#xFF1A;
/**
 * Created by Aivin on 2017/5/8.
 * &#x5355;&#x4F8B;&#x6A21;&#x5F0F; &#x7BA1;&#x7406;&#x4E00;&#x4E2A;&#x56DE;&#x8C03;&#x5BF9;&#x8C61;&#xFF0C;
 * &#x5B9E;&#x73B0;&#x4E24;&#x4E2A;&#x4E0D;&#x540C;&#x7684;activity&#x5B9E;&#x65F6;&#x901A;&#x8BAF;
 *&#x7528;&#x6237;&#x624B;&#x52A8;&#x6539;&#x53D8;&#x8BA1;&#x91CF;&#x5355;&#x4F4D;&#x540E;&#xFF0C;&#x901A;&#x77E5;&#x53E6;&#x5916;&#x4E00;&#x4E2A;activity&#x505A;&#x51FA;&#x76F8;&#x5E94;&#x7684;&#x6539;&#x53D8;
 */

public class UnitsChangeCallBackManager{
  private IUnitsModeChangeCallBack iUnitsModeChangeCallBack ;
   // &#x63A5;&#x53D7;&#x4F20;&#x5165;&#x7684;&#x56DE;&#x8C03;&#x5B9E;&#x4F8B;
    public void setiUnitsModeChangeCallBack(IUnitsModeChangeCallBack iUnitsModeChangeCallBack) {
        this.iUnitsModeChangeCallBack = iUnitsModeChangeCallBack;
    }
    public void sendUnitsChangedByUser(int type , int value , String msgStr) {
       if(iUnitsModeChangeCallBack !=null) {
           iUnitsModeChangeCallBack.onUnitsModeChange(type , value , msgStr);
       }
    }//

    /**&#x79C1;&#x6709;&#x5316;&#x6784;&#x9020;&#x51FD;&#x6570;&#xFF0C;&#x9632;&#x6B62;&#x88AB;&#x5176;&#x4ED6;&#x7C7B;&#x5B9E;&#x4F8B;&#x5316;*/
    private UnitsChangeCallBackManager()  {
        //&#x521D;&#x59CB;&#x5316;&#x64CD;&#x4F5C;
    }//

    /**&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x5185;&#x90E8;&#x7C7B;&#x6765;&#x7EF4;&#x62A4;&#x5355;&#x4F8B;
     *&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x4F7F;&#x7528;&#x5185;&#x90E8;&#x7C7B;&#x6765;&#x7EF4;&#x62A4;&#x5355;&#x4F8B;&#x7684;&#x5B9E;&#x73B0;&#x3002;
     *&#x5229;&#x7528;jvm&#x63D0;&#x4F9B;&#x7684;&#x673A;&#x5236;&#xFF0C;&#x52A0;&#x8F7D;&#x7C7B;&#x7684;&#x7EBF;&#x7A0B;&#x4E92;&#x65A5;&#x7684;&#xFF0C;&#x7528;&#x6765;&#x89E3;&#x51B3;&#x591A;&#x7EBF;&#x7A0B;&#x8BBF;&#x95EE;&#x7684;&#x65F6;&#x5019;&#x53EF;&#x80FD;&#x4F1A;&#x9047;&#x5230;null&#x7684;&#x95EE;&#x9898;&#x3002;
     **/
    private static class SingletonFactory   {
        private static UnitsChangeCallBackManager instance = new UnitsChangeCallBackManager();
    }

    /**&#x83B7;&#x53D6;&#x5B9E;&#x4F8B;,&#x5BF9;&#x5916;&#x63D0;&#x4F9B;&#x7684;&#x63A5;&#x53E3; */
    public static UnitsChangeCallBackManager getInstance()  {
        return SingletonFactory.instance;
    }

    /**&#x4E3A;&#x4E86;&#x80FD;&#x5728;&#x5E8F;&#x5217;&#x5316;&#x8FC7;&#x7A0B;&#x4ECD;&#x80FD;&#x4FDD;&#x6301;&#x5355;&#x4F8B;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x9700;&#x8981;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;readResolve()&#x65B9;&#x6CD5; */
    private Object readResolve()  {
        return getInstance();
    }
}

UnitsChangeCallBackManager.getInstance().setiUnitsModeChangeCallBack(this); // &#x8BBE;&#x7F6E;&#x56DE;&#x8C03;&#xFF1A;
public void onUnitsModeChange(int type, int value, String msgStr){
    switch (type) {
        case 1:  
          break;

    }
}
UnitsChangeCallBackManager.getInstance().sendUnitsChangedByUser(1,1 ,&quot;&#x82F1;&#x5C3A;&quot;); // &#x89E6;&#x53D1;&#x56DE;&#x8C03;
</code></pre>
<h2 id="&#x56DE;&#x8C03;&#x6548;&#x679C;---&#x533F;&#x540D;&#x5B50;&#x7C7B;&#x5B9E;&#x73B0;"><a name="&#x56DE;&#x8C03;&#x6548;&#x679C;---&#x533F;&#x540D;&#x5B50;&#x7C7B;&#x5B9E;&#x73B0;" class="anchor-navigation-ex-anchor" href="#&#x56DE;&#x8C03;&#x6548;&#x679C;---&#x533F;&#x540D;&#x5B50;&#x7C7B;&#x5B9E;&#x73B0;"><i class="fa fa-link" aria-hidden="true"></i></a>2.2. &#x56DE;&#x8C03;&#x6548;&#x679C; - &#x533F;&#x540D;&#x5B50;&#x7C7B;&#x5B9E;&#x73B0;</h2>
<pre><code class="lang-text">//  MyLayDemo &#x662F;&#x4E00;&#x4E2A;&#x666E;&#x901A;&#x7C7B;&#xFF0C;&#x4E0D;&#x662F;&#x63A5;&#x53E3;&#x3002;
MyLayDemo myLayDemo = new MyLayDemo(){
        @Override
        public void showInfo() {
            super.showInfo(); // &#x6267;&#x884C; MyLayDemo &#x7684; showInfo
            System.out.println(&quot;&#x6211;&#x5728; MyLayDemo &#x7684;&#x533F;&#x540D;&#x5B50;&#x7C7B;&#x4E2D; ...&quot;);
        }
    };
</code></pre>
<h1 id="&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x8BBE;&#x8BA1;&#x539F;&#x5219;"><a name="&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x8BBE;&#x8BA1;&#x539F;&#x5219;" class="anchor-navigation-ex-anchor" href="#&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x8BBE;&#x8BA1;&#x539F;&#x5219;"><i class="fa fa-link" aria-hidden="true"></i></a>3. &#x9762;&#x5411;&#x5BF9;&#x8C61;&#x8BBE;&#x8BA1;&#x539F;&#x5219;</h1>
<h2 id="&#x5355;&#x4E00;&#x804C;&#x8D23;"><a name="&#x5355;&#x4E00;&#x804C;&#x8D23;" class="anchor-navigation-ex-anchor" href="#&#x5355;&#x4E00;&#x804C;&#x8D23;"><i class="fa fa-link" aria-hidden="true"></i></a>3.1. &#x5355;&#x4E00;&#x804C;&#x8D23;</h2>
<pre><code class="lang-text">&#x4E00;&#x4E2A;&#x7C7B;&#x53EA;&#x8D1F;&#x8D23;&#x4E00;&#x4E2A;&#x529F;&#x80FD;&#x9886;&#x57DF;&#x4E2D;&#x7684;&#x76F8;&#x5E94;&#x804C;&#x8D23;&#x3002;
&#x5728;&#x8F6F;&#x4EF6;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF0C;&#x4E00;&#x4E2A;&#x7C7B;&#x627F;&#x62C5;&#x7684;&#x804C;&#x8D23;&#x8D8A;&#x591A;&#xFF0C;&#x5B83;&#x88AB;&#x590D;&#x7528;&#x7684;&#x53EF;&#x80FD;&#x6027;&#x5C31;&#x8D8A;&#x5C0F;&#x3002;
&#x4E00;&#x4E2A;&#x7C7B;&#x627F;&#x62C5;&#x7684;&#x804C;&#x8D23;&#x8FC7;&#x591A;&#xFF0C;&#x5C31;&#x76F8;&#x5F53;&#x4E8E;&#x5C06;&#x8FD9;&#x4E9B;&#x804C;&#x8D23;&#x8026;&#x5408;&#x5728;&#x4E00;&#x8D77;&#xFF0C;&#x5F53;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#x804C;&#x8D23;&#x53D8;&#x5316;&#x65F6;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x5F71;&#x54CD;&#x5176;&#x4ED6;&#x804C;&#x8D23;&#x7684;&#x8FD0;&#x4F5C;&#x3002;
&#x56E0;&#x6B64;&#xFF0C;&#x8981;&#x5C06;&#x8FD9;&#x4E9B;&#x804C;&#x8D23;&#x8FDB;&#x884C;&#x5206;&#x79BB;&#xFF0C;&#x5C06;&#x4E0D;&#x540C;&#x7684;&#x804C;&#x8D23;&#x5C01;&#x88C5;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x7C7B;&#x4E2D;&#x3002;
&#x5355;&#x4E00;&#x804C;&#x8D23;&#x539F;&#x5219;&#x662F;&#x5B9E;&#x73B0;&#x9AD8;&#x5185;&#x805A;&#x3001;&#x4F4E;&#x8026;&#x5408;&#x7684;&#x6307;&#x5BFC;&#x65B9;&#x9488;&#xFF0C;&#x5B83;&#x662F;&#x6700;&#x7B80;&#x5355;&#x4F46;&#x53C8;&#x6700;&#x96BE;&#x8FD0;&#x7528;&#x7684;&#x539F;&#x5219;&#x3002;
</code></pre>
<h3 id="&#x9AD8;&#x5185;&#x805A;&#x3001;&#x4F4E;&#x8026;&#x5408;"><a name="&#x9AD8;&#x5185;&#x805A;&#x3001;&#x4F4E;&#x8026;&#x5408;" class="anchor-navigation-ex-anchor" href="#&#x9AD8;&#x5185;&#x805A;&#x3001;&#x4F4E;&#x8026;&#x5408;"><i class="fa fa-link" aria-hidden="true"></i></a>3.1.1. &#x9AD8;&#x5185;&#x805A;&#x3001;&#x4F4E;&#x8026;&#x5408;</h3>
<pre><code class="lang-text">&#x9AD8;&#x5185;&#x805A; &#x662F;&#x6307;&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x662F;&#x7531;&#x76F8;&#x5173;&#x6027;&#x5F88;&#x5F3A;&#x7684;&#x4EE3;&#x7801;&#x7EC4;&#x6210;&#xFF0C;&#x53EA;&#x8D1F;&#x8D23;&#x4E00;&#x9879;&#x4EFB;&#x52A1;&#x3002;
&#x4F4E;&#x8026;&#x5408; &#x662F;&#x6307;&#x6A21;&#x5757;&#x4E0E;&#x6A21;&#x5757;&#x4E4B;&#x95F4;&#xFF0C;&#x5C3D;&#x53EF;&#x80FD;&#x7684;&#x4F7F;&#x5176;&#x72EC;&#x7ACB;&#x5B58;&#x5728;&#x3002;
</code></pre>
<h2 id="&#x5F00;&#x95ED;&#x539F;&#x5219;"><a name="&#x5F00;&#x95ED;&#x539F;&#x5219;" class="anchor-navigation-ex-anchor" href="#&#x5F00;&#x95ED;&#x539F;&#x5219;"><i class="fa fa-link" aria-hidden="true"></i></a>3.2. &#x5F00;&#x95ED;&#x539F;&#x5219;</h2>
<pre><code class="lang-text">&#x4E00;&#x4E2A; &#x8F6F;&#x4EF6;&#x5B9E;&#x4F53; &#x5E94;&#x5F53;&#x5BF9;&#x6269;&#x5C55;&#x5F00;&#x653E;&#xFF0C;&#x5BF9;&#x4FEE;&#x6539;&#x5173;&#x95ED;&#x3002;&#x5E94;&#x5C3D;&#x91CF;&#x5728;&#x4E0D;&#x4FEE;&#x6539;&#x539F;&#x6709;&#x4EE3;&#x7801;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x8FDB;&#x884C;&#x6269;&#x5C55;&#x3002;
//&#x8F6F;&#x4EF6;&#x5B9E;&#x4F53;&#xFF1A;
&#x53EF;&#x4EE5;&#x6307;&#x4E00;&#x4E2A;&#x8F6F;&#x4EF6;&#x6A21;&#x5757;&#x3001;&#x4E00;&#x4E2A;&#x7531;&#x591A;&#x4E2A;&#x7C7B;&#x7EC4;&#x6210;&#x7684;&#x5C40;&#x90E8;&#x7ED3;&#x6784;&#x6216;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x7C7B;&#x3002;

&#x5F53;&#x8F6F;&#x4EF6;&#x7CFB;&#x7EDF;&#x9700;&#x8981;&#x9762;&#x5BF9;&#x65B0;&#x7684;&#x9700;&#x6C42;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x5C3D;&#x91CF;&#x4FDD;&#x8BC1;&#x7CFB;&#x7EDF;&#x7684;&#x8BBE;&#x8BA1;&#x6846;&#x67B6;&#x662F;&#x7A33;&#x5B9A;&#x7684;&#x3002;
&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x8F6F;&#x4EF6;&#x8BBE;&#x8BA1;&#x7B26;&#x5408;&#x5F00;&#x95ED;&#x539F;&#x5219;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x975E;&#x5E38;&#x65B9;&#x4FBF;&#x5730;&#x5BF9;&#x7CFB;&#x7EDF;&#x8FDB;&#x884C;&#x6269;&#x5C55;&#xFF0C;&#x800C;&#x4E14;&#x5728;&#x6269;&#x5C55;&#x65F6;&#x65E0;&#x987B;&#x4FEE;&#x6539;&#x73B0;&#x6709;&#x4EE3;&#x7801;&#xFF0C;
&#x4F7F;&#x5F97;&#x8F6F;&#x4EF6;&#x7CFB;&#x7EDF;&#x5728;&#x62E5;&#x6709;&#x9002;&#x5E94;&#x6027;&#x548C;&#x7075;&#x6D3B;&#x6027;&#x7684;&#x540C;&#x65F6;&#x5177;&#x5907;&#x8F83;&#x597D;&#x7684;&#x7A33;&#x5B9A;&#x6027;&#x548C;&#x5EF6;&#x7EED;&#x6027;&#x3002;

&#x5728;Java&#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x4E3A;&#x7CFB;&#x7EDF;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x76F8;&#x5BF9;&#x7A33;&#x5B9A;&#x7684;&#x62BD;&#x8C61;&#x5C42;(&#x62BD;&#x8C61;&#x7C7B;&#x6216;&#x8005;&#x63A5;&#x53E3;)&#xFF0C;&#x800C;&#x5C06;&#x4E0D;&#x540C;&#x7684;&#x5B9E;&#x73B0;&#x884C;&#x4E3A;&#x79FB;&#x81F3;&#x5177;&#x4F53;&#x7684;&#x5B9E;&#x73B0;&#x5C42;&#x4E2D;&#x5B8C;&#x6210;&#x3002;
&#x589E;&#x52A0;&#x65B0;&#x7684;&#x5177;&#x4F53;&#x7C7B;&#x6765;&#x5B9E;&#x73B0;&#x65B0;&#x7684;&#x4E1A;&#x52A1;&#x529F;&#x80FD;&#xFF0C;&#x5728;&#x4E0D;&#x4FEE;&#x6539;&#x5DF2;&#x6709;&#x4EE3;&#x7801;&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x6269;&#x5C55;&#x7CFB;&#x7EDF;&#x7684;&#x529F;&#x80FD;&#x3002;

//&#x6CE8;&#x610F;&#xFF1A;
&#x56E0;&#x4E3A;xml&#x548C;properties&#x7B49;&#x683C;&#x5F0F;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x662F;&#x7EAF;&#x6587;&#x672C;&#x6587;&#x4EF6;&#xFF0C;&#x7F16;&#x8F91;&#x540E;&#x65E0;&#x987B;&#x7F16;&#x8BD1;&#xFF0C;
&#x56E0;&#x6B64;&#x5728;&#x8F6F;&#x4EF6;&#x5F00;&#x53D1;&#x4E2D;&#xFF0C;&#x4E00;&#x822C;&#x4E0D;&#x628A;&#x5BF9;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x4FEE;&#x6539;&#x8BA4;&#x4E3A;&#x662F;&#x5BF9;&#x7CFB;&#x7EDF;&#x6E90;&#x4EE3;&#x7801;&#x7684;&#x4FEE;&#x6539;&#x3002;
&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x7CFB;&#x7EDF;&#x5728;&#x6269;&#x5C55;&#x65F6;&#x53EA;&#x6D89;&#x53CA;&#x5230;&#x4FEE;&#x6539;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x800C;&#x539F;&#x6709;&#x7684;Java&#x4EE3;&#x7801;&#x6CA1;&#x6709;&#x505A;&#x4EFB;&#x4F55;&#x4FEE;&#x6539;&#xFF0C;
&#x5219;&#x53EF;&#x8BA4;&#x4E3A;&#x8BE5;&#x7CFB;&#x7EDF;&#x662F;&#x4E00;&#x4E2A;&#x7B26;&#x5408;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x7684;&#x7CFB;&#x7EDF;&#x3002;
</code></pre>
<h2 id="&#x63A5;&#x53E3;&#x9694;&#x79BB;&#x539F;&#x5219;"><a name="&#x63A5;&#x53E3;&#x9694;&#x79BB;&#x539F;&#x5219;" class="anchor-navigation-ex-anchor" href="#&#x63A5;&#x53E3;&#x9694;&#x79BB;&#x539F;&#x5219;"><i class="fa fa-link" aria-hidden="true"></i></a>3.3. &#x63A5;&#x53E3;&#x9694;&#x79BB;&#x539F;&#x5219;</h2>
<p>(Interface  Segregation Principle, ISP)</p>
<pre><code class="lang-text">&#x4F7F;&#x7528;&#x591A;&#x4E2A;&#x4E13;&#x95E8;&#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x800C;&#x4E0D;&#x4F7F;&#x7528;&#x5355;&#x4E00;&#x7684;&#x603B;&#x63A5;&#x53E3;&#x3002;
&#x56E0;&#x4E3A;&#x5728;&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x7F16;&#x7A0B;&#x8BED;&#x8A00;&#x4E2D;&#xFF0C;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x63A5;&#x53E3;&#x5C31;&#x9700;&#x8981;&#x5B9E;&#x73B0;&#x8BE5;&#x63A5;&#x53E3;&#x4E2D;&#x5B9A;&#x4E49;&#x7684;&#x6240;&#x6709;&#x65B9;&#x6CD5;&#xFF0C;&#x6240;&#x4EE5;&#x5927;&#x7684;&#x603B;&#x63A5;&#x53E3;&#x4F7F;&#x7528;&#x8D77;&#x6765;&#x4E0D;&#x4E00;&#x5B9A;&#x5F88;&#x65B9;&#x4FBF;&#x3002;

//&#x6CE8;&#x610F;&#xFF1A;
&#x5728;&#x4F7F;&#x7528;&#x63A5;&#x53E3;&#x9694;&#x79BB;&#x539F;&#x5219;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x63A7;&#x5236;&#x63A5;&#x53E3;&#x7684;&#x7C92;&#x5EA6;&#x3002;
1&#x3001;&#x63A5;&#x53E3;&#x4E0D;&#x80FD;&#x592A;&#x5C0F;&#x3002;&#x63A5;&#x53E3;&#x592A;&#x5C0F;&#x4F1A;&#x5BFC;&#x81F4;&#x7CFB;&#x7EDF;&#x4E2D;&#x63A5;&#x53E3;&#x6CDB;&#x6EE5;&#xFF0C;&#x4E0D;&#x5229;&#x4E8E;&#x7EF4;&#x62A4;&#xFF1B;
2&#x3001;&#x63A5;&#x53E3;&#x4E5F;&#x4E0D;&#x80FD;&#x592A;&#x5927;&#x3002;&#x592A;&#x5927;&#x7684;&#x63A5;&#x53E3;&#x5C06;&#x8FDD;&#x80CC;&#x63A5;&#x53E3;&#x9694;&#x79BB;&#x539F;&#x5219;&#xFF0C;&#x7075;&#x6D3B;&#x6027;&#x8F83;&#x5DEE;&#xFF0C;&#x4F7F;&#x7528;&#x8D77;&#x6765;&#x5F88;&#x4E0D;&#x65B9;&#x4FBF;&#x3002;
&#x4E00;&#x822C;&#x800C;&#x8A00;&#xFF0C;&#x63A5;&#x53E3;&#x4E2D;&#x4EC5;&#x5305;&#x542B;&#x4E3A;&#x67D0;&#x4E00;&#x7C7B;&#x7528;&#x6237;&#x5B9A;&#x5236;&#x7684;&#x65B9;&#x6CD5;&#x5373;&#x53EF;&#x3002;

//&#x201C;&#x63A5;&#x53E3;&#x201D;&#x5F80;&#x5F80;&#x6709;&#x4E24;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x542B;&#x4E49;&#xFF1A;
&#x5BF9;&#x4E8E;&#x4E0D;&#x540C;&#x7684;&#x542B;&#x4E49;&#xFF0C;ISP&#x7684;&#x8868;&#x8FBE;&#x65B9;&#x5F0F;&#x4EE5;&#x53CA;&#x542B;&#x4E49;&#x90FD;&#x6709;&#x6240;&#x4E0D;&#x540C;&#x3002;

1&#x3001;&#x628A;&#x63A5;&#x53E3;&#x7406;&#x89E3;&#x6210;&#x89D2;&#x8272;&#xFF0C;&#x4E00;&#x4E2A;&#x63A5;&#x53E3;&#x53EA;&#x80FD;&#x4EE3;&#x8868;&#x4E00;&#x4E2A;&#x89D2;&#x8272;&#xFF0C;&#x6BCF;&#x4E2A;&#x89D2;&#x8272;&#x90FD;&#x6709;&#x5B83;&#x7279;&#x5B9A;&#x7684;&#x4E00;&#x4E2A;&#x63A5;&#x53E3;&#xFF0C;
&#x6B64;&#x65F6;&#xFF0C;&#x8FD9;&#x4E2A;&#x539F;&#x4E5F;&#x53EF;&#x4EE5;&#x53EB;&#x505A;&#x201C;&#x89D2;&#x8272;&#x9694;&#x79BB;&#x539F;&#x5219;&#x201D;&#x3002;
2&#x3001;&#x5982;&#x679C;&#x628A;&#x201C;&#x63A5;&#x53E3;&#x201D;&#x7406;&#x89E3;&#x6210;&#x72ED;&#x4E49;&#x7684;&#x7279;&#x5B9A;&#x8BED;&#x8A00;&#x7684;&#x63A5;&#x53E3;&#xFF0C;
&#x90A3;&#x4E48;ISP&#x8868;&#x8FBE;&#x7684;&#x610F;&#x601D;&#x662F;&#x6307;&#x63A5;&#x53E3;&#x4EC5;&#x4EC5;&#x63D0;&#x4F9B;&#x5BA2;&#x6237;&#x7AEF;&#x9700;&#x8981;&#x7684;&#x884C;&#x4E3A;&#x3002;
</code></pre>
<h2 id="&#x4F9D;&#x8D56;&#x5012;&#x8F6C;&#x539F;&#x5219;"><a name="&#x4F9D;&#x8D56;&#x5012;&#x8F6C;&#x539F;&#x5219;" class="anchor-navigation-ex-anchor" href="#&#x4F9D;&#x8D56;&#x5012;&#x8F6C;&#x539F;&#x5219;"><i class="fa fa-link" aria-hidden="true"></i></a>3.4. &#x4F9D;&#x8D56;&#x5012;&#x8F6C;&#x539F;&#x5219;</h2>
<p>Dependency Inversion  Principle, DIP</p>
<pre><code class="lang-text">&#x62BD;&#x8C61;&#x4E0D;&#x5E94;&#x8BE5;&#x4F9D;&#x8D56;&#x4E8E;&#x7EC6;&#x8282;&#xFF0C;&#x7EC6;&#x8282;&#x5E94;&#x5F53;&#x4F9D;&#x8D56;&#x4E8E;&#x62BD;&#x8C61;&#x3002;&#x6362;&#x8A00;&#x4E4B;&#xFF0C;&#x8981;&#x9488;&#x5BF9;&#x63A5;&#x53E3;&#x7F16;&#x7A0B;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x9488;&#x5BF9;&#x5B9E;&#x73B0;&#x7F16;&#x7A0B;&#x3002;
DIP&#x8981;&#x6C42;&#x4F20;&#x9012;&#x53C2;&#x6570;&#x65F6;&#x6216;&#x5728;&#x5173;&#x8054;&#x5173;&#x7CFB;&#x4E2D;&#xFF0C;&#x5C3D;&#x91CF;&#x5F15;&#x7528;&#x5C42;&#x6B21;&#x9AD8;&#x7684;&#x62BD;&#x8C61;&#x5C42;&#x7C7B;&#xFF0C;&#x800C;&#x4E0D;&#x8981;&#x7528;&#x5177;&#x4F53;&#x7C7B;&#x3002;
&#x6211;&#x4EEC;&#x9700;&#x8981;&#x9488;&#x5BF9;&#x62BD;&#x8C61;&#x5C42;&#x7F16;&#x7A0B;&#x3002;&#x5C06;&#x5177;&#x4F53;&#x7C7B;&#x7684;&#x5BF9;&#x8C61;&#x901A;&#x8FC7;&#x4F9D;&#x8D56;&#x6CE8;&#x5165;&#x7684;&#x65B9;&#x5F0F;&#x6CE8;&#x5165;&#x5230;&#x5176;&#x4ED6;&#x5BF9;&#x8C61;&#x4E2D;&#x3002;

&#x4F9D;&#x8D56;&#x6CE8;&#x5165;(DependencyInjection, DI):
&#x5F53;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x8981;&#x4E0E;&#x5176;&#x4ED6;&#x5BF9;&#x8C61;&#x53D1;&#x751F;&#x4F9D;&#x8D56;&#x5173;&#x7CFB;&#x65F6;&#xFF0C;&#x901A;&#x8FC7;&#x62BD;&#x8C61;&#x6765;&#x6CE8;&#x5165;&#x6240;&#x4F9D;&#x8D56;&#x7684;&#x5BF9;&#x8C61;&#x3002;
&#x5E38;&#x7528;&#x7684;&#x6CE8;&#x5165;&#x65B9;&#x5F0F;&#x6709;&#x4E09;&#x79CD;&#xFF1A;
1&#x3001;&#x6784;&#x9020;&#x6CE8;&#x5165;&#x3002;&#x901A;&#x8FC7;&#x6784;&#x9020;&#x51FD;&#x6570;&#x6765;&#x4F20;&#x5165;&#x5177;&#x4F53;&#x7C7B;&#x7684;&#x5BF9;&#x8C61;&#xFF1B;
2&#x3001;&#x8BBE;&#x503C;&#x6CE8;&#x5165;&#x3002;&#x901A;&#x8FC7;Setter&#x65B9;&#x6CD5;&#x6765;&#x4F20;&#x5165;&#x5177;&#x4F53;&#x7C7B;&#x7684;&#x5BF9;&#x8C61;&#xFF1B;
3&#x3001;&#x63A5;&#x53E3;&#x6CE8;&#x5165;&#x3002;&#x901A;&#x8FC7;&#x5728;&#x63A5;&#x53E3;&#x4E2D;&#x58F0;&#x660E;&#x7684;&#x4E1A;&#x52A1;&#x65B9;&#x6CD5;&#x6765;&#x4F20;&#x5165;&#x5177;&#x4F53;&#x7C7B;&#x7684;&#x5BF9;&#x8C61;&#x3002;
</code></pre>
<h3 id="&#x4F9D;&#x8D56;&#x5012;&#x7F6E;&#x548C;&#x91CC;&#x6C0F;&#x66FF;&#x6362;&#x7684;&#x533A;&#x522B;"><a name="&#x4F9D;&#x8D56;&#x5012;&#x7F6E;&#x548C;&#x91CC;&#x6C0F;&#x66FF;&#x6362;&#x7684;&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x4F9D;&#x8D56;&#x5012;&#x7F6E;&#x548C;&#x91CC;&#x6C0F;&#x66FF;&#x6362;&#x7684;&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>3.4.1. &#x4F9D;&#x8D56;&#x5012;&#x7F6E;&#x548C;&#x91CC;&#x6C0F;&#x66FF;&#x6362;&#x7684;&#x533A;&#x522B;</h3>
<pre><code class="lang-text">&#x5728;&#x5927;&#x591A;&#x6570;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8FD9;&#x4E09;&#x4E2A;&#x8BBE;&#x8BA1;&#x539F;&#x5219;&#x4F1A;&#x540C;&#x65F6;&#x51FA;&#x73B0;&#xFF0C;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x662F;&#x76EE;&#x6807;&#xFF0C;&#x91CC;&#x6C0F;&#x4EE3;&#x6362;&#x539F;&#x5219;&#x662F;&#x57FA;&#x7840;&#xFF0C;&#x4F9D;&#x8D56;&#x5012;&#x8F6C;&#x539F;&#x5219;&#x662F;&#x624B;&#x6BB5;&#xFF0C;
&#x5B83;&#x4EEC;&#x76F8;&#x8F85;&#x76F8;&#x6210;&#xFF0C;&#x76F8;&#x4E92;&#x8865;&#x5145;&#xFF0C;&#x76EE;&#x6807;&#x4E00;&#x81F4;&#xFF0C;&#x53EA;&#x662F;&#x5206;&#x6790;&#x95EE;&#x9898;&#x65F6;&#x6240;&#x7AD9;&#x89D2;&#x5EA6;&#x4E0D;&#x540C;&#x800C;&#x5DF2;&#x3002;
1&#x3001;&#x5B9A;&#x4E49;&#x7684;&#x89D2;&#x5EA6;&#x4E0D;&#x540C;&#x3002;&#x91CC;&#x6C0F;&#x66FF;&#x6362;&#x539F;&#x5219;&#x662F;&#x5173;&#x4E8E;&#x5B50;&#x7C7B;&#x548C;&#x7236;&#x7C7B;&#x7684;&#x539F;&#x5219;;&#x4F9D;&#x8D56;&#x5012;&#x7F6E;&#x539F;&#x5219;&#x662F;&#x5173;&#x4E8E;&#x62BD;&#x8C61;&#x4E0E;&#x7EC6;&#x8282;&#x7684;&#x539F;&#x5219;&#x3002;
2&#x3001;&#x5E94;&#x7528;&#x8303;&#x56F4;&#x4E0D;&#x540C;&#x3002;&#x4F9D;&#x8D56;&#x5012;&#x7F6E;&#x539F;&#x5219;&#x4F7F;&#x7528;&#x8303;&#x56F4;&#x66F4;&#x5E7F;&#x3002;
&#x5728;&#x5927;&#x591A;&#x6570;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;OCP&#x3001;LSP&#x3001;DIP&#x4F1A;&#x540C;&#x65F6;&#x51FA;&#x73B0;&#x3002;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x662F;&#x76EE;&#x6807;&#xFF0C;&#x91CC;&#x6C0F;&#x4EE3;&#x6362;&#x539F;&#x5219;&#x662F;&#x57FA;&#x7840;&#xFF0C;
&#x4F9D;&#x8D56;&#x5012;&#x8F6C;&#x539F;&#x5219;&#x662F;&#x624B;&#x6BB5;&#xFF0C;&#x5B83;&#x4EEC;&#x76F8;&#x8F85;&#x76F8;&#x6210;&#xFF0C;&#x76F8;&#x4E92;&#x8865;&#x5145;&#xFF0C;&#x76EE;&#x6807;&#x4E00;&#x81F4;&#xFF0C;&#x53EA;&#x662F;&#x5206;&#x6790;&#x95EE;&#x9898;&#x65F6;&#x6240;&#x7AD9;&#x89D2;&#x5EA6;&#x4E0D;&#x540C;&#x800C;&#x5DF2;&#x3002;
</code></pre>
<h2 id="&#x91CC;&#x6C0F;&#x4EE3;&#x6362;&#x539F;&#x5219;"><a name="&#x91CC;&#x6C0F;&#x4EE3;&#x6362;&#x539F;&#x5219;" class="anchor-navigation-ex-anchor" href="#&#x91CC;&#x6C0F;&#x4EE3;&#x6362;&#x539F;&#x5219;"><i class="fa fa-link" aria-hidden="true"></i></a>3.5. &#x91CC;&#x6C0F;&#x4EE3;&#x6362;&#x539F;&#x5219;</h2>
<p>Liskov Substitution Principle, LSP</p>
<pre><code class="lang-text">**LSP** &#x662F;&#x7531;&#x9EBB;&#x7701;&#x7406;&#x5DE5;&#x5B66;&#x9662;&#x8BA1;&#x7B97;&#x673A;&#x79D1;&#x5B66;&#x5B9E;&#x9A8C;&#x5BA4;&#x7684;**Liskov**&#x5973;&#x58EB;&#x63D0;&#x51FA;&#x6765;&#x7684;&#x3002;&#x6240;&#x4EE5;&#x4EE5;&#x5979;&#x7684;&#x540D;&#x5B57;&#x547D;&#x540D;&#x3002;
&#x91CC;&#x6C0F;&#x4EE3;&#x6362;&#x539F;&#x5219;&#x8981;&#x6C42;&#xFF0C;&#x5728;&#x8F6F;&#x4EF6;&#x4E2D;&#x5C06;&#x4E00;&#x4E2A;&#x57FA;&#x7C7B;&#x5BF9;&#x8C61;&#x66FF;&#x6362;&#x6210;&#x5B83;&#x7684;&#x5B50;&#x7C7B;&#x5BF9;&#x8C61;&#xFF0C;&#x7A0B;&#x5E8F;&#x5C06;&#x4E0D;&#x4F1A;&#x4EA7;&#x751F;&#x4EFB;&#x4F55;&#x9519;&#x8BEF;&#x548C;&#x5F02;&#x5E38;&#xFF0C;&#x53CD;&#x8FC7;&#x6765;&#x5219;&#x4E0D;&#x6210;&#x7ACB;&#x3002;

&#x4F8B;&#x5982;&#xFF1A;&#x6211;&#x559C;&#x6B22;&#x52A8;&#x7269;&#xFF0C;&#x90A3;&#x6211;&#x4E00;&#x5B9A;&#x559C;&#x6B22;&#x72D7;&#xFF0C;&#x56E0;&#x4E3A;&#x72D7;&#x662F;&#x52A8;&#x7269;&#x7684;&#x5B50;&#x7C7B;&#xFF1B;&#x4F46;&#x662F;&#x6211;&#x559C;&#x6B22;&#x72D7;&#xFF0C;&#x4E0D;&#x80FD;&#x636E;&#x6B64;&#x65AD;&#x5B9A;&#x6211;&#x559C;&#x6B22;&#x6240;&#x6709;&#x52A8;&#x7269;&#x3002;
&#x91CC;&#x6C0F;&#x4EE3;&#x6362;&#x539F;&#x5219;&#x662F;&#x5B9E;&#x73B0;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x7684;&#x91CD;&#x8981;&#x65B9;&#x5F0F;&#x4E4B;&#x4E00;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x7A0B;&#x5E8F;&#x4E2D;&#x5C3D;&#x91CF;&#x4F7F;&#x7528;&#x57FA;&#x7C7B;&#x7C7B;&#x578B;&#x6765;&#x5BF9;&#x5BF9;&#x8C61;&#x8FDB;&#x884C;&#x5B9A;&#x4E49;&#xFF0C;
&#x800C;&#x5728;&#x8FD0;&#x884C;&#x65F6;&#x518D;&#x786E;&#x5B9A;&#x5176;&#x5B50;&#x7C7B;&#x7C7B;&#x578B;&#xFF0C;&#x7528;&#x5B50;&#x7C7B;&#x5BF9;&#x8C61;&#x6765;&#x66FF;&#x6362;&#x7236;&#x7C7B;&#x5BF9;&#x8C61;&#x3002;

//&#x5728;&#x4F7F;&#x7528;LSP&#x65F6;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x5982;&#x4E0B;&#x95EE;&#x9898;&#xFF1A;
1&#x3001;&#x5B50;&#x7C7B;&#x7684;&#x6240;&#x6709;&#x65B9;&#x6CD5;&#x5FC5;&#x987B;&#x5728;&#x7236;&#x7C7B;&#x4E2D;&#x58F0;&#x660E;&#xFF0C;&#x6216;&#x5B50;&#x7C7B;&#x5FC5;&#x987B;&#x5B9E;&#x73B0;&#x7236;&#x7C7B;&#x4E2D;&#x58F0;&#x660E;&#x7684;&#x6240;&#x6709;&#x65B9;&#x6CD5;&#x3002;
&#x56E0;&#x4E3A;&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x53EA;&#x5B58;&#x5728;&#x5B50;&#x7C7B;&#x4E2D;&#xFF0C;&#x5728;&#x7236;&#x7C7B;&#x4E2D;&#x4E0D;&#x63D0;&#x4F9B;&#x76F8;&#x5E94;&#x7684;&#x58F0;&#x660E;&#xFF0C;&#x5219;&#x65E0;&#x6CD5;&#x5728;&#x4EE5;&#x7236;&#x7C7B;&#x5B9A;&#x4E49;&#x7684;&#x5BF9;&#x8C61;&#x4E2D;&#x4F7F;&#x7528;&#x8BE5;&#x65B9;&#x6CD5;&#x3002;
2&#x3001;&#x5728;&#x8FD0;&#x7528;LSP&#x65F6;&#xFF0C;&#x5C3D;&#x91CF;&#x628A;&#x7236;&#x7C7B;&#x8BBE;&#x8BA1;&#x4E3A;&#x62BD;&#x8C61;&#x7C7B;&#x6216;&#x8005;&#x63A5;&#x53E3;&#xFF0C;&#x8BA9;&#x5B50;&#x7C7B;&#x7EE7;&#x627F;&#x7236;&#x7C7B;&#x6216;&#x5B9E;&#x73B0;&#x7236;&#x63A5;&#x53E3;&#xFF0C;&#x5E76;&#x5B9E;&#x73B0;&#x5728;&#x7236;&#x7C7B;&#x4E2D;&#x58F0;&#x660E;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;
&#x8FD0;&#x884C;&#x65F6;&#xFF0C;&#x5B50;&#x7C7B;&#x5B9E;&#x4F8B;&#x66FF;&#x6362;&#x7236;&#x7C7B;&#x5B9E;&#x4F8B;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5F88;&#x65B9;&#x4FBF;&#x5730;&#x6269;&#x5C55;&#x7CFB;&#x7EDF;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x540C;&#x65F6;&#x65E0;&#x987B;&#x4FEE;&#x6539;&#x539F;&#x6709;&#x5B50;&#x7C7B;&#x7684;&#x4EE3;&#x7801;&#x3002;

&#x9644;&#xFF1A; &#x7C7B;&#x4F3C; List tempList= new ArrayList() ;  ?
//&#x7533;&#x660E;&#x65F6;&#x7528;&#x57FA;&#x7C7B;List &#xFF0C; &#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x65F6;&#x7528;&#x5B50;&#x7C7B;ArrayList &#x3002;
</code></pre>
<h2 id="&#x8FEA;&#x7C73;&#x7279;&#x6CD5;&#x5219;-&#x3001;&#x5F97;&#x58A8;&#x5FD2;&#x8033;&#x6CD5;&#x5219;"><a name="&#x8FEA;&#x7C73;&#x7279;&#x6CD5;&#x5219;-&#x3001;&#x5F97;&#x58A8;&#x5FD2;&#x8033;&#x6CD5;&#x5219;" class="anchor-navigation-ex-anchor" href="#&#x8FEA;&#x7C73;&#x7279;&#x6CD5;&#x5219;-&#x3001;&#x5F97;&#x58A8;&#x5FD2;&#x8033;&#x6CD5;&#x5219;"><i class="fa fa-link" aria-hidden="true"></i></a>3.6. &#x8FEA;&#x7C73;&#x7279;&#x6CD5;&#x5219; &#x3001;&#x5F97;&#x58A8;&#x5FD2;&#x8033;&#x6CD5;&#x5219;</h2>
<p>(Law of  Demeter, LoD) ,&#x6709;&#x4E9B;&#x4E66;&#x4E5F;&#x8BD1;&#x4F5C; &#x201C;&#x5F97;&#x58A8;&#x5FD2;&#x8033;&#x6CD5;&#x5219;&#x201D; &#x3002;</p>
<pre><code class="lang-text">&#x4E00;&#x4E2A;&#x8F6F;&#x4EF6;&#x5B9E;&#x4F53;&#x5E94;&#x5F53;&#x5C3D;&#x53EF;&#x80FD;&#x5C11;&#x5730;&#x4E0E;&#x5176;&#x4ED6;&#x5B9E;&#x4F53;&#x53D1;&#x751F;&#x76F8;&#x4E92;&#x4F5C;&#x7528;&#x3002;
&#x8FEA;&#x7C73;&#x7279;&#x6CD5;&#x5219;&#x53EF;&#x964D;&#x4F4E;&#x7CFB;&#x7EDF;&#x7684;&#x8026;&#x5408;&#x5EA6;&#xFF0C;&#x5F53;&#x5176;&#x4E2D;&#x67D0;&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x53D1;&#x751F;&#x4FEE;&#x6539;&#x65F6;&#xFF0C;&#x5C31;&#x4F1A;&#x5C3D;&#x91CF;&#x5C11;&#x5730;&#x5F71;&#x54CD;&#x5176;&#x4ED6;&#x6A21;&#x5757;&#x3002;

//&#x6240;&#x4EE5;&#x5728;&#x7C7B;&#x7684;&#x7ED3;&#x6784;&#x8BBE;&#x8BA1;&#x4E0A;&#xFF1A;
1&#x3001;&#x6BCF;&#x4E00;&#x4E2A;&#x7C7B;&#x90FD;&#x5E94;&#x5F53;&#x5C3D;&#x91CF;&#x964D;&#x4F4E;&#x5176;&#x6210;&#x5458;&#x53D8;&#x91CF;&#x548C;&#x6210;&#x5458;&#x51FD;&#x6570;&#x7684;&#x8BBF;&#x95EE;&#x6743;&#x9650;&#xFF1B;
2&#x3001;&#x5728;&#x7C7B;&#x7684;&#x8BBE;&#x8BA1;&#x4E0A;&#xFF0C;&#x53EA;&#x8981;&#x6709;&#x53EF;&#x80FD;&#xFF0C;&#x4E00;&#x4E2A;&#x7C7B;&#x578B;&#x5E94;&#x5F53;&#x8BBE;&#x8BA1;&#x6210;&#x4E0D;&#x53D8;&#x7C7B;&#xFF1B;
3&#x3001;&#x5728;&#x5BF9;&#x5176;&#x4ED6;&#x7C7B;&#x7684;&#x5F15;&#x7528;&#x4E0A;&#xFF0C;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x5BF9;&#x5176;&#x4ED6;&#x5BF9;&#x8C61;&#x7684;&#x5F15;&#x7528;&#x5E94;&#x5F53;&#x964D;&#x5230;&#x6700;&#x4F4E;&#x3002;

&#x8FEA;&#x7C73;&#x7279;&#x6CD5;&#x5219;&#x8FD8;&#x6709;&#x51E0;&#x79CD;&#x5B9A;&#x4E49;&#x5F62;&#x5F0F;&#xFF0C;&#x5305;&#x62EC;&#xFF1A;&#x4E0D;&#x8981;&#x548C;&#x201C;&#x964C;&#x751F;&#x4EBA;&#x201D;&#x8BF4;&#x8BDD;&#x3001;&#x53EA;&#x4E0E;&#x4F60;&#x7684;&#x76F4;&#x63A5;&#x670B;&#x53CB;&#x901A;&#x4FE1;&#x7B49;
&#x5176;&#x670B;&#x53CB;&#x5305;&#x62EC;&#x4EE5;&#x4E0B;&#x51E0;&#x7C7B;&#xFF1A;
1&#x3001;&#x5F53;&#x524D;&#x5BF9;&#x8C61;&#x672C;&#x8EAB;(this)&#xFF1B;
2&#x3001;&#x4EE5;&#x53C2;&#x6570;&#x5F62;&#x5F0F;&#x4F20;&#x5165;&#x5230;&#x5F53;&#x524D;&#x5BF9;&#x8C61;&#x65B9;&#x6CD5;&#x4E2D;&#x7684;&#x5BF9;&#x8C61;&#xFF1B;
3&#x3001;&#x5F53;&#x524D;&#x5BF9;&#x8C61;&#x7684;&#x6210;&#x5458;&#x5BF9;&#x8C61;&#xFF1B;
4&#x3001; &#x5982;&#x679C;&#x5F53;&#x524D;&#x5BF9;&#x8C61;&#x7684;&#x6210;&#x5458;&#x5BF9;&#x8C61;&#x662F;&#x4E00;&#x4E2A;&#x96C6;&#x5408;&#xFF0C;&#x90A3;&#x4E48;&#x96C6;&#x5408;&#x4E2D;&#x7684;&#x5143;&#x7D20;&#x4E5F;&#x90FD;&#x662F;&#x670B;&#x53CB;&#xFF1B;
5&#x3001;&#x5F53;&#x524D;&#x5BF9;&#x8C61;&#x6240;&#x521B;&#x5EFA;&#x7684;&#x5BF9;&#x8C61;&#x3002;

&#x4EFB;&#x4F55;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#xFF0C;&#x5982;&#x679C;&#x6EE1;&#x8DB3;&#x4E0A;&#x9762;&#x7684;&#x6761;&#x4EF6;&#x4E4B;&#x4E00;&#xFF0C;&#x5C31;&#x662F;&#x5F53;&#x524D;&#x5BF9;&#x8C61;&#x7684;&#x201C;&#x670B;&#x53CB;&#x201D;&#xFF0C;&#x5426;&#x5219;&#x5C31;&#x662F;&#x201C;&#x964C;&#x751F;&#x4EBA;&#x201D;&#x3002;
&#x8FEA;&#x7C73;&#x7279;&#x6CD5;&#x5219;&#x8981;&#x6C42;&#x6211;&#x4EEC;&#x5728;&#x8BBE;&#x8BA1;&#x7CFB;&#x7EDF;&#x65F6;&#xFF0C;&#x5E94;&#x8BE5;&#x5C3D;&#x91CF;&#x51CF;&#x5C11;&#x5BF9;&#x8C61;&#x4E4B;&#x95F4;&#x7684;&#x4EA4;&#x4E92;&#xFF0C;
&#x5982;&#x679C;&#x4E24;&#x4E2A;&#x5BF9;&#x8C61;&#x4E4B;&#x95F4;&#x4E0D;&#x5FC5;&#x5F7C;&#x6B64;&#x76F4;&#x63A5;&#x901A;&#x4FE1;&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x4E24;&#x4E2A;&#x5BF9;&#x8C61;&#x5C31;&#x4E0D;&#x5E94;&#x5F53;&#x53D1;&#x751F;&#x4EFB;&#x4F55;&#x76F4;&#x63A5;&#x7684;&#x76F8;&#x4E92;&#x4F5C;&#x7528;&#xFF0C;
&#x5982;&#x679C;&#x5176;&#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x9700;&#x8981;&#x8C03;&#x7528;&#x53E6;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;&#x67D0;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x7684;&#x8BDD;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7B2C;&#x4E09;&#x8005;&#x8F6C;&#x53D1;&#x8FD9;&#x4E2A;&#x8C03;&#x7528;&#x3002;
&#x7B80;&#x8A00;&#x4E4B;&#xFF0C;&#x5C31;&#x662F;&#x901A;&#x8FC7;&#x5F15;&#x5165;&#x4E00;&#x4E2A;&#x5408;&#x7406;&#x7684;&#x7B2C;&#x4E09;&#x8005;&#x6765;&#x964D;&#x4F4E;&#x73B0;&#x6709;&#x5BF9;&#x8C61;&#x4E4B;&#x95F4;&#x7684;&#x8026;&#x5408;&#x5EA6;&#x3002;
</code></pre>
<h2 id="&#x5408;&#x6210;&#x590D;&#x7528;&#x539F;&#x5219;"><a name="&#x5408;&#x6210;&#x590D;&#x7528;&#x539F;&#x5219;" class="anchor-navigation-ex-anchor" href="#&#x5408;&#x6210;&#x590D;&#x7528;&#x539F;&#x5219;"><i class="fa fa-link" aria-hidden="true"></i></a>3.7. &#x5408;&#x6210;&#x590D;&#x7528;&#x539F;&#x5219;</h2>
<p>(Composite Reuse Principle, CRP),
&#x6709;&#x4E00;&#x4E9B;&#x4E66;&#x4E0A;&#x6CA1;&#x6709;&#x5217;&#x4E0A;CRP&#xFF0C;&#x53EA;&#x8BF4;&#x201C;&#x516D;&#x5927;&#x8BBE;&#x8BA1;&#x539F;&#x5219;&#x201D; &#x3002;</p>
<pre><code class="lang-text">&#x7EC4;&#x5408;&#x590D;&#x7528;&#x539F;&#x5219;&#x3001;&#x805A;&#x5408;&#x590D;&#x7528;&#x539F;&#x5219;
&#x5C3D;&#x91CF;&#x4F7F;&#x7528;&#x5BF9;&#x8C61;&#x7EC4;&#x5408;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x7EE7;&#x627F;&#x6765;&#x8FBE;&#x5230;&#x590D;&#x7528;&#x7684;&#x76EE;&#x7684;&#x3002;

&#x5728;&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x8BBE;&#x8BA1;&#x4E2D;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4E24;&#x79CD;&#x65B9;&#x6CD5;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x73AF;&#x5883;&#x4E2D;&#x590D;&#x7528;&#x5DF2;&#x6709;&#x7684;&#x8BBE;&#x8BA1;&#x548C;&#x5B9E;&#x73B0;:
1&#x3001;&#x901A;&#x8FC7; &#x7EC4;&#x5408;/&#x805A;&#x5408; &#x5B9E;&#x73B0; 
&#x7EC4;&#x5408;/&#x805A;&#x5408;&#x53EF;&#x4EE5;&#x4F7F;&#x7CFB;&#x7EDF;&#x66F4;&#x52A0;&#x7075;&#x6D3B;&#xFF0C;&#x964D;&#x4F4E;&#x7C7B;&#x4E0E;&#x7C7B;&#x4E4B;&#x95F4;&#x7684;&#x8026;&#x5408;&#x5EA6;&#x3002;&#x8BF7;&#x4F18;&#x5148;&#x8003;&#x8651;&#x3002;

2&#x3001;&#x901A;&#x8FC7; &#x7EE7;&#x627F; &#x5B9E;&#x73B0;
&#x7EE7;&#x627F;&#x590D;&#x7528;&#x4F1A;&#x7834;&#x574F;&#x7CFB;&#x7EDF;&#x7684;&#x5C01;&#x88C5;&#x6027;&#xFF0C;&#x56E0;&#x4E3A;&#x7EE7;&#x627F;&#x4F1A;&#x5C06;&#x57FA;&#x7C7B;&#x7684;&#x5B9E;&#x73B0;&#x7EC6;&#x8282;&#x66B4;&#x9732;&#x7ED9;&#x5B50;&#x7C7B;&#x3002;
&#x7531;&#x4E8E;&#x57FA;&#x7C7B;&#x7684;&#x5185;&#x90E8;&#x7EC6;&#x8282;&#x901A;&#x5E38;&#x5BF9;&#x5B50;&#x7C7B;&#x6765;&#x8BF4;&#x662F;&#x53EF;&#x89C1;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x79CD;&#x590D;&#x7528;&#x53C8;&#x79F0;&#x201C;&#x767D;&#x7BB1;&#x201D;&#x590D;&#x7528;&#x3002;
&#x4E00;&#x822C;&#x800C;&#x8A00;&#xFF0C;&#x5982;&#x679C;&#x4E24;&#x4E2A;&#x7C7B;&#x4E4B;&#x95F4;&#x662F;&#x201C;Has-A&#x201D;&#x7684;&#x5173;&#x7CFB;&#x5E94;&#x4F7F;&#x7528;&#x7EC4;&#x5408;&#x6216;&#x805A;&#x5408;&#xFF1B;
&#x5982;&#x679C;&#x662F;&#x201C;Is-A&#x201D;&#x5173;&#x7CFB;&#x53EF;&#x4F7F;&#x7528;&#x7EE7;&#x627F;&#x3002;
</code></pre>
<h1 id="&#x4E2D;&#x4ECB;&#x8005;&#x6A21;&#x5F0F;"><a name="&#x4E2D;&#x4ECB;&#x8005;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x4E2D;&#x4ECB;&#x8005;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>4. &#x4E2D;&#x4ECB;&#x8005;&#x6A21;&#x5F0F;</h1>
<pre><code class="lang-text">Mediator Pattern ,&#x201C;&#x4E2D;&#x4ECB;&#x8005;&#x6A21;&#x5F0F;&#x201D; &#x662F; &#x201C;&#x8FEA;&#x7C73;&#x7279;&#x6CD5;&#x5219;&#x201D; &#x7684;&#x4E00;&#x4E2A;&#x5178;&#x578B;&#x5E94;&#x7528;&#x3002;&#xFF08;&#x4E0D;&#x8981;&#x4E0E;&#x964C;&#x751F;&#x4EBA;&#x8BF4;&#x8BDD;&#xFF09;&#x3002; 
&#x540C;&#x4E8B;&#x7C7B;&#x4E4B;&#x95F4;&#x6CA1;&#x6709;&#x76F4;&#x63A5;&#x663E;&#x793A;&#x4EA4;&#x6D41; &#xFF0C;&#x800C;&#x662F;&#x901A;&#x8FC7;&#x4E2D;&#x4ECB;&#x7C7B;&#xFF08;&#x5B9A;&#x4E49;&#x4E86;&#x884C;&#x4E3A;&#x63A5;&#x53E3;&#xFF09;&#x8FDB;&#x884C;&#x901A;&#x4FE1;&#x3002;
</code></pre>
<p><img src="https://gitee.com/hnyer/filesOfGitbook/raw/master/files/201803261940_osChina_&#x7F51;&#x72B6;&#x7ED3;&#x6784;_&#x661F;&#x5F62;&#x7ED3;&#x6784;.png" alt=""></p>
<h2 id="&#x5E94;&#x7528;&#x573A;&#x666F;"><a name="&#x5E94;&#x7528;&#x573A;&#x666F;" class="anchor-navigation-ex-anchor" href="#&#x5E94;&#x7528;&#x573A;&#x666F;"><i class="fa fa-link" aria-hidden="true"></i></a>4.1. &#x5E94;&#x7528;&#x573A;&#x666F;</h2>
<pre><code class="lang-text">1&#x3001;&#x5728;&#x6709;&#x4E9B;&#x8F6F;&#x4EF6;&#x4E2D;&#xFF0C;&#x67D0;&#x4E9B;&#x7C7B;/&#x5BF9;&#x8C61;&#x4E4B;&#x95F4;&#x7684;&#x76F8;&#x4E92;&#x8C03;&#x7528;&#x5173;&#x7CFB;&#x9519;&#x7EFC;&#x590D;&#x6742;&#xFF0C;&#x7C7B;&#x4F3C;QQ&#x7528;&#x6237;&#x4E4B;&#x95F4;&#x7684;&#x5173;&#x7CFB;&#xFF0C;
&#x6B64;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x7279;&#x522B;&#x9700;&#x8981;&#x4E00;&#x4E2A;&#x7C7B;&#x4F3C;&#x201C;QQ&#x7FA4;&#x201D;&#x4E00;&#x6837;&#x7684;&#x4E2D;&#x95F4;&#x7C7B;&#x6765;&#x534F;&#x8C03;&#x8FD9;&#x4E9B;&#x7C7B;/&#x5BF9;&#x8C61;&#x4E4B;&#x95F4;&#x7684;&#x590D;&#x6742;&#x5173;&#x7CFB; &#x3002;
2&#x3001; &#x8BF7;&#x7ED3;&#x5408;&#x73B0;&#x5B9E;&#x751F;&#x6D3B;&#x4E2D;&#x7684; &#x201C;&#x4E2D;&#x4ECB;&#x201D;&#x8FDB;&#x884C;&#x7406;&#x89E3;&#x3002; &#x623F;&#x4EA7;&#x4E2D;&#x4ECB;...
</code></pre>
<h2 id="&#x4F18;&#x7F3A;&#x70B9;"><a name="&#x4F18;&#x7F3A;&#x70B9;" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x7F3A;&#x70B9;"><i class="fa fa-link" aria-hidden="true"></i></a>4.2. &#x4F18;&#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">// &#x4F18;&#x70B9;
1&#x3001; &#x7B80;&#x5316;&#x4E86;&#x5BF9;&#x8C61;&#x4E4B;&#x95F4;&#x7684;&#x4EA4;&#x4E92;&#xFF0C;&#x5C06;&#x539F;&#x672C;&#x96BE;&#x4EE5;&#x7406;&#x89E3;&#x7684;&#x7F51;&#x72B6;&#x7ED3;&#x6784;&#x8F6C;&#x6362;&#x6210;&#x76F8;&#x5BF9;&#x7B80;&#x5355;&#x7684;&#x661F;&#x578B;&#x7ED3;&#x6784;&#x3002;
2&#x3001; &#x589E;&#x52A0;&#x65B0;&#x7684;&#x4E2D;&#x4ECB;&#x8005;&#x548C;&#x65B0;&#x7684;&#x540C;&#x4E8B;&#x7C7B;&#x90FD;&#x6BD4;&#x8F83;&#x65B9;&#x4FBF;&#xFF0C;&#x66F4;&#x597D;&#x5730;&#x7B26;&#x5408;&#x201C;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x201D;&#x3002;

// &#x7F3A;&#x70B9;
1&#x3001; &#x4E2D;&#x4ECB;&#x8005;&#x7C7B;&#x4E2D;&#x5305;&#x542B;&#x4E86;&#x5927;&#x91CF;&#x540C;&#x4E8B;&#x7C7B;&#x4E4B;&#x95F4;&#x7684;&#x4EA4;&#x4E92;&#x7EC6;&#x8282;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x5BFC;&#x81F4;&#x4E2D;&#x4ECB;&#x8005;&#x7C7B;&#x975E;&#x5E38;&#x590D;&#x6742;
</code></pre>
<h1 id="&#x4EAB;&#x5143;&#x6A21;&#x5F0F;"><a name="&#x4EAB;&#x5143;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x4EAB;&#x5143;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>5. &#x4EAB;&#x5143;&#x6A21;&#x5F0F;</h1>
<pre><code class="lang-text">Flyweight Pattern
&#x5F53;&#x7CFB;&#x7EDF;&#x4E2D;&#x5B58;&#x5728;&#x5927;&#x91CF;&#x76F8;&#x4F3C;&#x6216;&#x76F8;&#x540C;&#x7684;&#x5BF9;&#x8C61;&#x65F6;&#xFF0C;&#x5C06;&#x4F1A;&#x5BFC;&#x81F4;&#x8FD0;&#x884C;&#x4EE3;&#x4EF7;&#x8FC7;&#x9AD8;&#x3001;OOM &#x7B49;&#x95EE;&#x9898;&#xFF0C;&#x4EAB;&#x5143;&#x6A21;&#x5F0F;&#x6B63;&#x4E3A;&#x89E3;&#x51B3;&#x4E4B;&#x4E00;&#x7C7B;&#x95EE;&#x9898;&#x800C;&#x8BDE;&#x751F;&#x3002;
1&#x3001;&#x4EAB;&#x5143;&#x6A21;&#x5F0F;&#x5728;&#x4F7F;&#x7528;&#x65F6;&#x5B58;&#x5728;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x95EE;&#x9898;&#xFF0C;&#x9700;&#x8981;&#x8003;&#x8651;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x3002;
2&#x3001;&#x901A;&#x5E38;&#x7528;&#x4E00;&#x4E2A; &#x5DE5;&#x5382;&#x7C7B; &#x7C7B;&#x7EF4;&#x62A4;&#x4EAB;&#x5143;&#x5BF9;&#x8C61;&#x3002;

// &#x5185;&#x90E8;&#x72B6;&#x6001; Internal State
&#x5B58;&#x50A8;&#x5728;&#x4EAB;&#x5143;&#x5BF9;&#x8C61;&#x5185;&#x90E8;&#x5E76;&#x4E14;&#x4E0D;&#x4F1A;&#x968F;&#x73AF;&#x5883;&#x6539;&#x53D8;&#x800C;&#x6539;&#x53D8;&#x7684;&#x72B6;&#x6001;&#xFF0C;&#x5185;&#x90E8;&#x72B6;&#x6001;&#x53EF;&#x4EE5;&#x5171;&#x4EAB;&#x3002;

// &#x5916;&#x90E8;&#x72B6;&#x6001; External State
&#x968F;&#x73AF;&#x5883;&#x6539;&#x53D8;&#x800C;&#x6539;&#x53D8;&#x7684;&#x3001;&#x4E0D;&#x53EF;&#x4EE5;&#x5171;&#x4EAB;&#x7684;&#x72B6;&#x6001;&#x3002;&#x5916;&#x90E8;&#x72B6;&#x6001;&#x7531;&#x5BA2;&#x6237;&#x7AEF;&#x4FDD;&#x5B58;&#x3002;
&#x5916;&#x90E8;&#x72B6;&#x6001;&#x4E0D;&#x53EF;&#x4EE5;&#x5F71;&#x54CD;&#x4EAB;&#x5143;&#x5BF9;&#x8C61;&#x7684;&#x5185;&#x90E8;&#x72B6;&#x6001;&#xFF0C;&#x5B83;&#x4EEC;&#x662F;&#x76F8;&#x4E92;&#x72EC;&#x7ACB;&#x7684;&#x3002;
</code></pre>
<h2 id="&#x7F3A;&#x70B9;"><a name="&#x7F3A;&#x70B9;" class="anchor-navigation-ex-anchor" href="#&#x7F3A;&#x70B9;"><i class="fa fa-link" aria-hidden="true"></i></a>5.1. &#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">1&#x3001;&#x5BF9;&#x8C61; &#x9700;&#x8981;&#x5206;&#x79BB;&#x51FA; &#x5185;&#x90E8;&#x72B6;&#x6001; &#x548C; &#x5916;&#x90E8;&#x72B6;&#x6001;&#xFF0C;&#x8FD9;&#x4F7F;&#x5F97;&#x7A0B;&#x5E8F;&#x7684;&#x903B;&#x8F91;&#x590D;&#x6742;&#x5316;&#x3002;
2&#x3001;&#x8BFB;&#x53D6;&#x5916;&#x90E8;&#x72B6;&#x6001;&#x4F7F;&#x5F97;&#x8FD0;&#x884C;&#x65F6;&#x95F4;&#x53D8;&#x957F;&#x3002;
</code></pre>
<h2 id="&#x793A;&#x4F8B;"><a name="&#x793A;&#x4F8B;" class="anchor-navigation-ex-anchor" href="#&#x793A;&#x4F8B;"><i class="fa fa-link" aria-hidden="true"></i></a>5.2. &#x793A;&#x4F8B;</h2>
<p><img src="https://gitee.com/hnyer/filesOfGitbook/raw/master/files/201803271357_osChina_&#x4EAB;&#x5143;&#x6A21;&#x5F0F;.png" alt=""></p>
<p>&#x56F4;&#x68CB;&#x68CB;&#x76D8;&#x4E2D;&#x5305;&#x542B;&#x5927;&#x91CF;&#x7684;&#x9ED1;&#x5B50;&#x548C;&#x767D;&#x5B50;&#xFF0C;&#x5B83;&#x4EEC;&#x7684;&#x5F62;&#x72B6;&#x3001;&#x5927;&#x5C0F;&#x90FD;&#x4E00;&#x6A21;&#x4E00;&#x6837;&#xFF0C;&#x53EA;&#x662F;&#x51FA;&#x73B0;&#x7684;&#x4F4D;&#x7F6E;&#x4E0D;&#x540C;&#x800C;&#x5DF2;&#x3002;
&#x5982;&#x679C;&#x5C06;&#x6BCF;&#x4E00;&#x4E2A;&#x68CB;&#x5B50;&#x90FD;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x5BF9;&#x8C61;&#x5B58;&#x50A8;&#x5728;&#x5185;&#x5B58;&#x4E2D;&#xFF0C;&#x5C06;&#x5BFC;&#x81F4;&#x8BE5;&#x56F4;&#x68CB;&#x8F6F;&#x4EF6;&#x5728;&#x8FD0;&#x884C;&#x65F6;&#x6240;&#x9700;&#x5185;&#x5B58;&#x7A7A;&#x95F4;&#x8F83;&#x5927;&#x3002;</p>
<pre><code class="lang-text">class Chessman   {
  private String color; // &#x5185;&#x90E8;&#x72B6;&#x6001;
  private Point location;// &#x5916;&#x90E8;&#x72B6;&#x6001;
  public Chessman(String color)
  { ...}
  public String getColor()
  { ... }
  public String getLocation()
  { ...}
  /**&#x66F4;&#x65B0;&#x5916;&#x90E8;&#x72B6;&#x6001; &#x9700;&#x8981;&#x4E3B;&#x8981;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;*/
  public synchronized void updateLocation( Point loation)
  { ...  }
}
public class ChessmanFactory {
    /**&#x4EAB;&#x5143;&#x6C60;*/
    private static Map&lt;String,Chessman&gt; map=new HashMap&lt;&gt;();
    public static ChessFlyWeight getChess(String color)  {
        if(map.get(color)!=null){
            return map.get(color);
        }else{
            Chessman chessman=new Chessman(color);
            map.put(color, chessman);
            return chessman;
        }
    }
}
//&#x591A;&#x6B21;&#x8C03;&#x7528; &#x4E5F;&#x53EA;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A; Chessman &#x5BF9;&#x8C61;
Chessman chessman=ChessmanFactory.getChess(&quot;&#x9ED1;&#x8272;&quot;);
</code></pre>
<h1 id="&#x4EE3;&#x7406;&#x6A21;&#x5F0F;"><a name="&#x4EE3;&#x7406;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x4EE3;&#x7406;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>6. &#x4EE3;&#x7406;&#x6A21;&#x5F0F;</h1>
<p>Proxy Pattern,</p>
<pre><code class="lang-text">&#x5F53;&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x67D0;&#x4E2A;&#x5BF9;&#x8C61;&#x6216;&#x8BBF;&#x95EE;&#x67D0;&#x4E2A;&#x5BF9;&#x8C61;&#x5B58;&#x5728;&#x56F0;&#x96BE;&#x65F6;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x4EE3;&#x7406;&#x5BF9;&#x8C61;&#x6765;&#x95F4;&#x63A5;&#x8BBF;&#x95EE;&#x3002;
&#x5173;&#x952E;&#x70B9;&#xFF1A;&#x4EE3;&#x7406;&#x5BF9;&#x8C61;&#x63A7;&#x5236;&#x5BF9;&#x539F;&#x5BF9;&#x8C61;&#x7684;&#x5F15;&#x7528; &#x3002;
</code></pre>
<h2 id="&#x9759;&#x6001;&#x4EE3;&#x7406;"><a name="&#x9759;&#x6001;&#x4EE3;&#x7406;" class="anchor-navigation-ex-anchor" href="#&#x9759;&#x6001;&#x4EE3;&#x7406;"><i class="fa fa-link" aria-hidden="true"></i></a>6.1. &#x9759;&#x6001;&#x4EE3;&#x7406;</h2>
<pre><code class="lang-text">&#x4EE3;&#x7406;&#x7C7B;&#x4E0E;&#x59D4;&#x6258;&#x7C7B;&#x6709;&#x540C;&#x6837;&#x7684;&#x63A5;&#x53E3;&#x3002;&#x901A;&#x8FC7;&#x4EE3;&#x7406;&#x5BF9;&#x8C61;&#x8BBF;&#x95EE;&#x76EE;&#x6807;&#x5BF9;&#x8C61;&#x3002;
1&#x3001;&#x53EF;&#x4EE5;&#x5728;&#x76EE;&#x6807;&#x5BF9;&#x8C61;&#x5B9E;&#x73B0;&#x7684;&#x57FA;&#x7840;&#x4E0A;,&#x589E;&#x5F3A;&#x989D;&#x5916;&#x7684;&#x529F;&#x80FD;&#x64CD;&#x4F5C; &#x3002;(&#x8FD9;&#x4E00;&#x70B9;&#x8DDF;&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F;&#x4E00;&#x6837;)
&#x5B9E;&#x73B0;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x63A7;&#x5236;&#x7B56;&#x7565;&#x3002;

// &#x59D4;&#x6258;&#x7C7B; &#x5B9E;&#x73B0;&#x7684;&#x63A5;&#x53E3;
public interface IUser{
    public String getUserInfo();
}

// &#x59D4;&#x6258;&#x7C7B;&#x3002;&#x5BF9;&#x5916;&#x63D0;&#x4F9B; &#x67E5;&#x8BE2;&#x7528;&#x6237;&#x4FE1;&#x606F;&#x7684;&#x529F;&#x80FD;&#x3002;
public class UserTools implements IUser{
    public String getUserInfo(){
      return &quot;he is tom&quot;;
    }
}

/**
 * &#x4EE3;&#x7406;&#x7C7B;&#x3002; &#x5B9E;&#x73B0;&#x7684;&#x63A5;&#x53E3;&#x4E0E;&#x59D4;&#x6258;&#x7C7B;&#x4E00;&#x6A21;&#x4E00;&#x6837;&#x3002;
 * &#x7528;&#x6237;&#x901A;&#x8FC7;&#x4EE3;&#x7406;&#x4F5C;&#x4E3A;&#x4E2D;&#x95F4;&#x4EBA;&#x53BB;&#x4F7F;&#x7528;&#x539F;&#x5BF9;&#x8C61;&#x62E5;&#x6709;&#x7684;&#x529F;&#x80FD;&#x3002;
 * &#x4F46;&#x662F;&#x771F;&#x6B63;&#x6267;&#x884C;&#x7684;&#x8FD8;&#x662F;&#x539F;&#x6765;&#x7684;&#x5BF9;&#x8C61;&#x3002;
 */
public class UserToolsProxy implements IUser{
  private UserTools  userTools ;
    public String getUserInfo() {
      //&#x505A;&#x6388;&#x6743;&#x5224;&#x65AD;
      boolean isTheRightTime = true of false...;
      if(isTheRightTime){
          return userTools.getUserInfo();
      }else{
          return &quot;wrong time&quot;;
      }
}
</code></pre>
<h2 id="&#x52A8;&#x6001;&#x4EE3;&#x7406;"><a name="&#x52A8;&#x6001;&#x4EE3;&#x7406;" class="anchor-navigation-ex-anchor" href="#&#x52A8;&#x6001;&#x4EE3;&#x7406;"><i class="fa fa-link" aria-hidden="true"></i></a>6.2. &#x52A8;&#x6001;&#x4EE3;&#x7406;</h2>
<pre><code class="lang-text">&#x56E0;&#x4E3A;&#x9759;&#x6001;&#x4EE3;&#x7406;&#x7684;&#x65B9;&#x6848;&#x662F;&#x9700;&#x8981;&#x7F16;&#x5199;&#x597D;&#x4EE3;&#x7801;&#x7684;&#xFF0C;
&#x4EE3;&#x7406;&#x7C7B;&#x4E0E;&#x59D4;&#x6258;&#x7C7B;&#x6709;&#x540C;&#x6837;&#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x5982;&#x679C; &#x59D4;&#x6258;&#x7C7B; &#x65B9;&#x6CD5;&#x6570;&#x91CF;&#x8F83;&#x591A;&#xFF0C;&#x91C7;&#x7528;&#x9759;&#x6001;&#x4EE3;&#x7406;&#x65B9;&#x6848;&#xFF0C;
&#x4EE3;&#x7406;&#x7C7B;&#x7684;&#x4EE3;&#x7801;&#x5C31;&#x6BD4;&#x8F83;&#x5197;&#x4F59;&#xFF0C;&#x5DE5;&#x4F5C;&#x91CF;&#x6BD4;&#x8F83;&#x5927;&#x3002;

&#x52A8;&#x6001;&#x4EE3;&#x7406; &#x53EF;&#x4EE5;&#x5728;&#x4E0D;&#x6539;&#x53D8;&#x6E90;&#x7801;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x76F4;&#x63A5;&#x5728;&#x65B9;&#x6CD5;&#x4E2D;&#x63D2;&#x5165;&#x81EA;&#x5B9A;&#x4E49;&#x903B;&#x8F91;&#x3002;
&#x8FD9;&#x79CD;&#x7F16;&#x7A0B;&#x6A21;&#x578B;&#x6709;&#x4E00;&#x4E2A;&#x4E13;&#x4E1A;&#x540D;&#x79F0;&#x53EB; AOP (Aspect Oriented Programming &#x9762;&#x5411;&#x5207;&#x9762;&#x7F16;&#x7A0B;) &#x3002;

JDK&#x7684;&#x52A8;&#x6001;&#x4EE3;&#x7406;&#x673A;&#x5236;&#x53EA;&#x80FD;&#x4EE3;&#x7406;&#x5B9E;&#x73B0;&#x4E86;&#x63A5;&#x53E3;&#x7684;&#x7C7B;&#x3002;
JDK &#x52A8;&#x6001;&#x4EE3;&#x7406;&#x662F;&#x57FA;&#x4E8E;&#x63A5;&#x53E3;&#x8BBE;&#x8BA1;&#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x5982;&#x679C; &#x59D4;&#x6258;&#x7C7B;&#x6CA1;&#x6709;&#x5B9E;&#x73B0;&#x63A5;&#x53E3;&#xFF0C;&#x4F1A;&#x629B;&#x5F02;&#x5E38;&#x3002;
Exception in thread &quot;main&quot; java.lang.ClassCastException

//  &#x529F;&#x80FD;&#x63A5;&#x53E3;
public interface UserService {
    public void select();
    public void update();
}

// &#x59D4;&#x6258;&#x7C7B;
public class UserServiceImpl implements UserService {
    @Override
    public void select() {
        System.out.println(&quot;&#x59D4;&#x6258;&#x7C7B;&#x539F;&#x59CB;&#x9009;&#x62E9;&#x529F;&#x80FD;&quot;);
    }

    @Override
    public void update() {
        System.out.println(&quot;&#x59D4;&#x6258;&#x7C7B;&#x539F;&#x59CB;&#x66F4;&#x65B0;&#x529F;&#x80FD;&quot;);
    }
}

// &#x52A8;&#x6001;&#x4EE3;&#x7406; &#x65B0;&#x529F;&#x80FD;&#x5904;&#x7406;&#x7C7B;
public class LogHandler implements InvocationHandler {
    private Object target;
    // target &#x662F;&#x59D4;&#x6258;&#x7C7B;
    LogHandler(Object target){
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.print(&quot;--- &quot;+ method.getName()); // &#x65B9;&#x6CD5;&#x540D;
        before();
        Object result = method.invoke(target, args);
        after();
        return result;
    }

    private void before() {
        System.out.println(&quot;\r\n&quot;);
        System.out.println(String.format(&quot;&#x52A8;&#x6001;&#x4EE3;&#x7406;&#x6DFB;&#x52A0;&#x7684;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#x529F;&#x80FD; &#xFF0C;&#x65E5;&#x5FD7;&#x5F00;&#x59CB;&#x8BB0;&#x5F55;&#x4E8E; [%s] &quot;, new Date()));
    }
    private void after() {
        System.out.println(String.format(&quot;&#x52A8;&#x6001;&#x4EE3;&#x7406;&#x6DFB;&#x52A0;&#x7684;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#x529F;&#x80FD; &#xFF0C;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#x7ED3;&#x675F;&#x4E8E; [%s] &quot;, new Date()));
    }
}

// &#x6D4B;&#x8BD5;
UserServiceImpl userServiceImpl = new UserServiceImpl();
// &#x59D4;&#x6258;&#x7C7B;&#x7684; &#x7C7B;&#x52A0;&#x8F7D;&#x5668;
ClassLoader classLoader = userServiceImpl.getClass().getClassLoader();
// &#x59D4;&#x6258;&#x7C7B;&#x5B9E;&#x73B0;&#x7684;&#x63A5;&#x53E3;
Class[] interfaces = userServiceImpl.getClass().getInterfaces();
// &#x9700;&#x8981; &#x5207;&#x5165;&#x6DFB;&#x52A0;&#x7684; &#x4E8B;&#x4EF6;&#x5904;&#x7406;&#x5668;
InvocationHandler logHandler = new LogHandler(userServiceImpl);
// JDK &#x751F;&#x6210;&#x52A8;&#x6001;&#x4EE3;&#x7406;
UserService proxy = (UserService) Proxy.newProxyInstance(classLoader, interfaces, logHandler);
// &#x52A8;&#x6001;&#x4EE3;&#x7406;&#x7684; &#x65B9;&#x6CD5;
proxy.select();
proxy.update();
</code></pre>
<h2 id="cglib-&#x52A8;&#x6001;&#x4EE3;&#x7406;"><a name="cglib-&#x52A8;&#x6001;&#x4EE3;&#x7406;" class="anchor-navigation-ex-anchor" href="#cglib-&#x52A8;&#x6001;&#x4EE3;&#x7406;"><i class="fa fa-link" aria-hidden="true"></i></a>6.3. cglib &#x52A8;&#x6001;&#x4EE3;&#x7406;</h2>
<pre><code class="lang-text">JDK&#x7684;&#x52A8;&#x6001;&#x4EE3;&#x7406;&#x7528;&#x8D77;&#x6765;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x6709;&#x4E00;&#x4E2A;&#x9650;&#x5236;&#xFF0C;
&#x5C31;&#x662F;&#x4F7F;&#x7528;&#x52A8;&#x6001;&#x4EE3;&#x7406;&#x7684;&#x5BF9;&#x8C61;&#x5FC5;&#x987B;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x63A5;&#x53E3;&#x3002;
&#x5982;&#x679C;&#x60F3;&#x4EE3;&#x7406;&#x6CA1;&#x6709;&#x5B9E;&#x73B0;&#x63A5;&#x53E3;&#x7684;&#x7EE7;&#x627F;&#x7C7B;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; CGLIB &#x5305;&#x3002;

CGLIB &#x5305;&#x4F7F;&#x7528;&#x5B57;&#x8282;&#x7801;&#x5904;&#x7406;&#x6846;&#x67B6; ASM (Java&#x5B57;&#x8282;&#x7801;&#x64CD;&#x63A7;&#x6846;&#x67B6;),
&#x901A;&#x8FC7;&#x5B57;&#x8282;&#x7801;&#x6280;&#x672F;&#x4E3A;&#x4E00;&#x4E2A;&#x7C7B;&#x521B;&#x5EFA;&#x5B50;&#x7C7B;&#xFF0C;&#x5E76;&#x5728;&#x5B50;&#x7C7B;&#x4E2D;&#x91C7;&#x7528;&#x65B9;&#x6CD5;&#x62E6;&#x622A;&#x7684;&#x6280;&#x672F;&#x62E6;&#x622A;&#x6240;&#x6709;&#x7236;&#x7C7B;&#x65B9;&#x6CD5;&#x7684;&#x8C03;&#x7528;&#xFF0C;
&#x987A;&#x52BF;&#x7EC7;&#x5165;&#x6A2A;&#x5207;&#x903B;&#x8F91;&#xFF0C;&#x6765;&#x5B8C;&#x6210;&#x52A8;&#x6001;&#x4EE3;&#x7406;&#x7684;&#x5B9E;&#x73B0;&#x3002;
</code></pre>
<h2 id="&#x4EE3;&#x7406;&#x6A21;&#x5F0F;&#x548C;&#x63A5;&#x53E3;&#x56DE;&#x8C03;&#x7684;&#x533A;&#x522B;"><a name="&#x4EE3;&#x7406;&#x6A21;&#x5F0F;&#x548C;&#x63A5;&#x53E3;&#x56DE;&#x8C03;&#x7684;&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x4EE3;&#x7406;&#x6A21;&#x5F0F;&#x548C;&#x63A5;&#x53E3;&#x56DE;&#x8C03;&#x7684;&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>6.4. &#x4EE3;&#x7406;&#x6A21;&#x5F0F;&#x548C;&#x63A5;&#x53E3;&#x56DE;&#x8C03;&#x7684;&#x533A;&#x522B;</h2>
<p>&#x8DDF;&#x505A;iOS&#x7684;&#x540C;&#x4E8B;&#x66FE;&#x7ECF;&#x8BA8;&#x8BBA;&#x8FC7;&#xFF0C;&#x5BF9;&#x65B9;&#x8BF4;&#x4EE3;&#x7406;&#x6A21;&#x5F0F;&#x548C;&#x63A5;&#x53E3;&#x56DE;&#x8C03;&#x7406;&#x89E3;&#x8D77;&#x6765;&#x5DEE;&#x4E0D;&#x591A;&#x3002;
( &#x53EF;&#x80FD;&#x662F;iOS&#x7684;&#x4EE3;&#x7406;&#x7684;&#x5B9A;&#x4E49;&#x4E0D;&#x4E00;&#x6837;?) &#x6211;&#x4E2A;&#x4EBA;&#x8BA4;&#x4E3A;&#x8FD9;&#x4E24;&#x8005;&#x76F8;&#x5DEE;&#x8FD8;&#x662F;&#x6BD4;&#x8F83;&#x5927;&#x7684;&#xFF0C;&#x51FA;&#x53D1;&#x70B9;&#x548C;&#x5B9A;&#x4E49;&#x90FD;&#x4E0D;&#x4E00;&#x6837;&#x3002;</p>
<h1 id="&#x5355;&#x4F8B;&#x6A21;&#x5F0F;--singleton-pattern"><a name="&#x5355;&#x4F8B;&#x6A21;&#x5F0F;--singleton-pattern" class="anchor-navigation-ex-anchor" href="#&#x5355;&#x4F8B;&#x6A21;&#x5F0F;--singleton-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>7. &#x5355;&#x4F8B;&#x6A21;&#x5F0F;  Singleton Pattern</h1>
<pre><code class="lang-text">&#x901A;&#x8FC7;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x53EF;&#x4EE5;&#x4FDD;&#x8BC1;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF0C;&#x5E94;&#x7528;&#x8BE5;&#x6A21;&#x5F0F;&#x7684;&#x4E00;&#x4E2A;&#x7C7B;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x5B9E;&#x4F8B; &#x3002;
1&#x3001;&#x5355;&#x4F8B;&#x7C7B;&#x53EA;&#x80FD;&#x6709;&#x4E00;&#x4E2A;&#x5B9E;&#x4F8B;

2&#x3001;&#x5355;&#x4F8B;&#x7C7B;&#x5FC5;&#x987B;&#x81EA;&#x5DF1;&#x81EA;&#x5DF1;&#x521B;&#x5EFA;&#x81EA;&#x5DF1;&#x7684;&#x552F;&#x4E00;&#x5B9E;&#x4F8B;&#x3002;
(&#x4E0D;&#x8003;&#x8651;&#x53CD;&#x5C04;&#x673A;&#x5236;)&#x5916;&#x90E8;&#x53EA;&#x80FD;&#x901A;&#x8FC7; getInstance() &#x8BBF;&#x95EE;&#x3002;

4&#x3001;&#x6784;&#x9020;&#x65B9;&#x6CD5;&#x9650;&#x5B9A;&#x4E3A; private &#xFF0C;&#x9632;&#x6B62;&#x5916;&#x90E8;&#x5B9E;&#x4F8B;&#x5316;&#x8BE5;&#x7C7B;&#x7684;&#x5BF9;&#x8C61;
</code></pre>
<h2 id="&#x4F7F;&#x7528;&#x573A;&#x666F;"><a name="&#x4F7F;&#x7528;&#x573A;&#x666F;" class="anchor-navigation-ex-anchor" href="#&#x4F7F;&#x7528;&#x573A;&#x666F;"><i class="fa fa-link" aria-hidden="true"></i></a>7.1. &#x4F7F;&#x7528;&#x573A;&#x666F;</h2>
<pre><code class="lang-text">1&#x3001;&#x67D0;&#x4E9B;&#x5927;&#x578B;&#x7684;&#x7C7B;&#x521B;&#x5EFA;&#x9891;&#x7E41;&#x65F6;&#x4F1A;&#x5BFC;&#x81F4;&#x5F88;&#x5927;&#x7684;&#x7CFB;&#x7EDF;&#x5F00;&#x9500;&#x3002;
2&#x3001;&#x8F6F;&#x4EF6;&#x7CFB;&#x7EDF;&#x4E2D;&#x6709;&#x4E9B;&#x5730;&#x65B9;&#x53EA;&#x80FD;&#x6709;&#x4E00;&#x4E2A;&#x5B9E;&#x4F8B;&#xFF0C;&#x5426;&#x5219;&#x4F1A;&#x51FA;&#x73B0;&#x5404;&#x79CD;&#x95EE;&#x9898;&#x3002;
&#x4F8B;&#x5982;&#x6253;&#x5370;&#x673A;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x72B6;&#x6001;&#x4E0D;&#x4E00;&#x81F4;&#x800C;&#x91C7;&#x7528;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x3002;
</code></pre>
<h2 id="&#x7F3A;&#x70B9;_1"><a name="&#x7F3A;&#x70B9;_1" class="anchor-navigation-ex-anchor" href="#&#x7F3A;&#x70B9;_1"><i class="fa fa-link" aria-hidden="true"></i></a>7.2. &#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">&#x5355;&#x4F8B;&#x5B9E;&#x4F8B;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x548C;&#x8F6F;&#x4EF6;&#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x4E00;&#x6837;&#x957F;&#x3002;
&#x5982;&#x679C;&#x5B83;&#x6301;&#x6709;&#x67D0;&#x4E9B;&#x5BF9;&#x8C61;&#x7684;&#x5F15;&#x7528; &#xFF0C;&#x4F1A;&#x5BFC;&#x81F4;&#x8BE5;&#x5BF9;&#x8C61;&#x65E0;&#x6CD5;&#x91CA;&#x653E;&#x3002;
</code></pre>
<h2 id="&#x997F;&#x6C49;&#x5F0F;-&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x4E0D;&#x63A8;&#x8350;&#xFF0C;&#x6709;&#x5E76;&#x53D1;&#x95EE;&#x9898;"><a name="&#x997F;&#x6C49;&#x5F0F;-&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x4E0D;&#x63A8;&#x8350;&#xFF0C;&#x6709;&#x5E76;&#x53D1;&#x95EE;&#x9898;" class="anchor-navigation-ex-anchor" href="#&#x997F;&#x6C49;&#x5F0F;-&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x4E0D;&#x63A8;&#x8350;&#xFF0C;&#x6709;&#x5E76;&#x53D1;&#x95EE;&#x9898;"><i class="fa fa-link" aria-hidden="true"></i></a>7.3. &#x997F;&#x6C49;&#x5F0F; &#x5355;&#x4F8B;&#x6A21;&#x5F0F; (&#x4E0D;&#x63A8;&#x8350;&#xFF0C;&#x6709;&#x5E76;&#x53D1;&#x95EE;&#x9898;)</h2>
<pre><code class="lang-text">&#x5B9E;&#x4F8B;&#x5728;&#x7C7B;&#x52A0;&#x8F7D;&#x7684;&#x65F6;&#x5019;&#x5373;&#x88AB;&#x5B9E;&#x4F8B;&#x5316;(jvm&#x7684;&#x673A;&#x5236;&#xFF0C;&#x52A0;&#x8F7D;&#x7C7B;&#x7684;&#x7EBF;&#x7A0B;&#x4E92;&#x65A5;)&#xFF0C;&#x56E0;&#x6B64;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x3002;
&#x6CA1;&#x6709;&#x5EF6;&#x8FDF;&#x52A0;&#x8F7D;&#xFF0C;&#x5982;&#x679C;&#x957F;&#x65F6;&#x95F4;&#x6CA1;&#x7528;&#x5230;&#x8FD9;&#x4E2A;&#x5B9E;&#x4F8B;&#xFF0C;&#x5219;&#x4F1A;&#x9020;&#x6210;&#x5185;&#x5B58;&#x7684;&#x6D6A;&#x8D39;&#x3002;
&#x5982;&#x679C;&#x5B9E;&#x4F8B;&#x521D;&#x59CB;&#x5316;&#x65F6;&#x95F4;&#x957F;&#x800C;&#x9700;&#x8981;&#x5EF6;&#x8FDF;&#x521D;&#x59CB;&#x5316; &#x5C31;&#x8981;&#x8003;&#x8651;&#x7528;&#x61D2;&#x6C49;&#x6A21;&#x5F0F;&#x4E86;&#x3002;

public class SingletonBean {
    private  SingletonBean(){  }
    // &#x5728;&#x7C7B;&#x52A0;&#x8F7D;&#x7684;&#x65F6;&#x5019;&#x5373;&#x88AB;&#x5B9E;&#x4F8B;&#x5316;
    private static final SingletonBean singleton=new SingletonBean();
    public SingletonBean getIncetance(){
        return singleton;
    }
}
</code></pre>
<h2 id="&#x7B80;&#x5355;-&#x61D2;&#x6C49;&#x5F0F;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x4E0D;&#x63A8;&#x8350;-&#xFF0C;&#x6548;&#x7387;&#x4E0D;&#x9AD8;"><a name="&#x7B80;&#x5355;-&#x61D2;&#x6C49;&#x5F0F;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x4E0D;&#x63A8;&#x8350;-&#xFF0C;&#x6548;&#x7387;&#x4E0D;&#x9AD8;" class="anchor-navigation-ex-anchor" href="#&#x7B80;&#x5355;-&#x61D2;&#x6C49;&#x5F0F;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x4E0D;&#x63A8;&#x8350;-&#xFF0C;&#x6548;&#x7387;&#x4E0D;&#x9AD8;"><i class="fa fa-link" aria-hidden="true"></i></a>7.4. &#x7B80;&#x5355; &#x61D2;&#x6C49;&#x5F0F;&#x5355;&#x4F8B;&#x6A21;&#x5F0F; (&#x4E0D;&#x63A8;&#x8350; &#xFF0C;&#x6548;&#x7387;&#x4E0D;&#x9AD8;)</h2>
<pre><code class="lang-text">&#x5355;&#x7EBF;&#x7A0B;&#x4E0B;&#x6CA1;&#x6709;&#x5B89;&#x5168;&#x95EE;&#x9898;&#xFF0C;
&#x591A;&#x7EBF;&#x7A0B;&#x4E0B;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x591A;&#x4E2A;&#x7EBF;&#x7A0B;&#x540C;&#x65F6;&#x62FF;&#x5230; if (null == instance) &#xFF0C;
&#x6240;&#x4EE5;&#x53EF;&#x80FD;&#x4F1A;&#x4EA7;&#x751F;&#x591A;&#x4E2A;&#x5B9E;&#x4F8B;&#x3002;
&#x53EF;&#x4EE5;&#x52A0; synchronized &#x89E3;&#x51B3;&#x5B89;&#x5168;&#x95EE;&#x9898;&#xFF0C;&#x8BA9;&#x7EBF;&#x7A0B;&#x4E32;&#x884C;&#x6267;&#x884C;&#x3002;
&#x7EDD;&#x5927;&#x90E8;&#x5206;&#x7684;&#x8017;&#x65F6;&#x90FD;&#x7528;&#x5728;synchronized&#x4FEE;&#x9970;&#x7B26;&#x7684;&#x540C;&#x6B65;&#x51C6;&#x5907;&#x4E0A;&#xFF0C;&#x56E0;&#x6B64;&#x4ECE;&#x6027;&#x80FD;&#x4E0A;&#x6765;&#x8BF4;&#x5F88;&#x4E0D;&#x5212;&#x7B97;&#x3002;

public class SingletonBean {
    private  SingletonBean(){  }
    private static SingletonBean singleton = null;
    public synchronized static SingletonBean getIncetance() {
        if (singleton == null) {
            singleton = new SingletonBean();
        }
        return singleton;
    }
}
</code></pre>
<h2 id="dcl---volatile--&#x61D2;&#x6C49;&#x6A21;&#x5F0F;-&#x63A8;&#x8350;"><a name="dcl---volatile--&#x61D2;&#x6C49;&#x6A21;&#x5F0F;-&#x63A8;&#x8350;" class="anchor-navigation-ex-anchor" href="#dcl---volatile--&#x61D2;&#x6C49;&#x6A21;&#x5F0F;-&#x63A8;&#x8350;"><i class="fa fa-link" aria-hidden="true"></i></a>7.5. DCL  + Volatile  &#x61D2;&#x6C49;&#x6A21;&#x5F0F; (&#x63A8;&#x8350;)</h2>
<p>DCL (Double-Check-Locking  ) &#x53CC;&#x91CD;&#x68C0;&#x67E5;&#x9501;&#x5B9A; &#x3002;</p>
<pre><code class="lang-text">public class SingletonBean{
    private static volatile SingletonBean instance = null;
    public  static SingletonBean getInstance() {
        if(null == instance) { // &#x7B2C;&#x4E00;&#x6B21;&#x68C0;&#x67E5;
            synchronized (SingletonBean.class) {
                if(null == instance) { // &#x7B2C;&#x4E8C;&#x6B21;&#x68C0;&#x67E5; + volatile &#x914D;&#x5408;&#x907F;&#x514D;&#x4E86;&#x521B;&#x5EFA;&#x591A;&#x4E2A;&#x5B9E;&#x4F8B;
                    instance = new SingletonBean();
                }
            }
        }
        return instance;
    }
}

&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x7684;&#x5173;&#x952E;&#x70B9;&#xFF1A;
1&#x3001;&#x5FC5;&#x987B;&#x8981;&#x6709; volatile &#xFF0C;&#x5426;&#x5219;&#x53EF;&#x80FD;&#x51FA;&#x73B0;Java&#x4E2D;&#x7684;&#x53E6;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B;&#x770B;&#x5230;&#x4E2A;&#x521D;&#x59CB;&#x5316;&#x4E86;&#x4E00;&#x534A;&#x7684; instance &#x7684;&#x60C5;&#x51B5;&#x3002;
2&#x3001;&#x7B2C;&#x4E00;&#x6B21;&#x68C0;&#x67E5;&#x4E0D;&#x4E0A;&#x9501;&#xFF0C;&#x4E3A;&#x4E86;&#x9632;&#x6B62;&#x6BCF;&#x6B21;&#x8BBF;&#x95EE;&#x65F6;&#x90FD;&#x8981;&#x53BB;&#x7ADE;&#x4E89;&#x9501;&#xFF0C;&#x51CF;&#x5C11;&#x7B49;&#x5F85;&#x65F6;&#x95F4;&#xFF0C;
&#x7B2C;&#x4E8C;&#x6B21;&#x68C0;&#x67E5; &#x662F; volatile + synchronized &#x786E;&#x4FDD;&#x751F;&#x6210;&#x552F;&#x4E00;&#x7684;&#x5B9E;&#x4F8B;&#x3002;

instance = new SingletonBean() &#x8FD9;&#x53E5;&#x4EE3;&#x7801;&#x88AB;&#x7F16;&#x8BD1;&#x6210;&#x591A;&#x6761;&#x6307;&#x4EE4;&#xFF0C;&#x5927;&#x81F4;&#x505A;&#x4E86;&#x4E0B;&#x9762;&#x4E09;&#x4EF6;&#x4E8B;
1&#x3001;&#x7ED9;instance&#x5B9E;&#x4F8B;&#x5206;&#x914D;&#x5185;&#x5B58;
2&#x3001;&#x521D;&#x59CB;&#x5316;instance&#x7684;&#x6784;&#x9020;&#x5668; (&#x771F;&#x6B63;&#x521D;&#x59CB;&#x5316;)
3&#x3001;&#x5C06;instance&#x5BF9;&#x8C61;&#x6307;&#x5411;&#x5206;&#x914D;&#x7684;&#x5185;&#x5B58;&#x7A7A;&#x95F4;&#xFF08;&#x5230;&#x8FD9;&#x6B65;&#x65F6;instance&#x5C31;&#x975E;null&#x4E86;&#xFF09;

volatile &#x7981;&#x6B62;&#x6307;&#x4EE4;&#x91CD;&#x6392;&#xFF0C;&#x786E;&#x4FDD; &#x6B65;&#x9AA4;3&#x5728;&#x6B65;&#x9AA4;2&#x4E4B;&#x540E;&#x6267;&#x884C; &#x3002;
</code></pre>
<h2 id="holder-&#x61D2;&#x6C49;&#x6A21;&#x5F0F;-&#x63A8;&#x8350;"><a name="holder-&#x61D2;&#x6C49;&#x6A21;&#x5F0F;-&#x63A8;&#x8350;" class="anchor-navigation-ex-anchor" href="#holder-&#x61D2;&#x6C49;&#x6A21;&#x5F0F;-&#x63A8;&#x8350;"><i class="fa fa-link" aria-hidden="true"></i></a>7.6. Holder &#x61D2;&#x6C49;&#x6A21;&#x5F0F; (&#x63A8;&#x8350;)</h2>
<p>&#x6CE8;&#x610F;&#xFF0C;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x7684;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x4E0D;&#x592A;&#x9002;&#x5408;&#x5C06;&#x5355;&#x4F8B;&#x5BF9;&#x8C61;&#x9500;&#x6BC1;&#x540E;&#x518D;&#x6B21;&#x65B0;&#x5EFA;&#x3002;
&#x5982;&#x679C;&#x6709;&#x8FD9;&#x79CD;&#x9700;&#x6C42;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; &#x201C;&#x53CC;&#x91CD;&#x68C0;&#x67E5;&#x9501;&#x5B9A;&#x201D;&#x8FD9;&#x79CD;&#x521B;&#x5EFA;&#x65B9;&#x5F0F;&#x3002;</p>
<pre><code class="lang-text">&#x5C06;&#x61D2;&#x52A0;&#x8F7D;&#x548C;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;(&#x65E0;&#x9501;)&#x5B8C;&#x7F8E;&#x7ED3;&#x5408;&#x7684;&#x4E00;&#x79CD;&#x65B9;&#x5F0F; &#x3002;
public class SingletonBean{
    private static SingletonBean  instance = null ;
    private SingletonBean() {  }

    public static SingletonBean getInstance() {
        return SingletonFactory.instance;
    }

    /**
     * &#x9759;&#x6001;&#x7684;&#x6210;&#x5458;&#x5F0F;&#x5185;&#x90E8;&#x7C7B;&#xFF0C;&#x8BE5;&#x5185;&#x90E8;&#x7C7B;&#x7684;&#x5B9E;&#x4F8B;&#x4E0E;&#x5916;&#x90E8;&#x7C7B;&#x7684;&#x5B9E;&#x4F8B;&#x6CA1;&#x6709;&#x7ED1;&#x5B9A;&#x5173;&#x7CFB;&#xFF0C;
     * &#x800C;&#x4E14;&#x53EA;&#x6709;&#x88AB;&#x8C03;&#x7528;&#x5230;&#x624D;&#x4F1A;&#x88C5;&#x8F7D;&#xFF0C;&#x4ECE;&#x800C;&#x5B9E;&#x73B0;&#x4E86;&#x5EF6;&#x8FDF;&#x52A0;&#x8F7D;
     */
    private static class SingletonFactory  {
        // &#x7531; JVM &#x6765;&#x4FDD;&#x8BC1;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;
        private static SingletonBean instance = new SingletonBean();
    }
}
</code></pre>
<h2 id="&#x679A;&#x4E3E;-&#x61D2;&#x6C49;&#x6A21;&#x5F0F;"><a name="&#x679A;&#x4E3E;-&#x61D2;&#x6C49;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x679A;&#x4E3E;-&#x61D2;&#x6C49;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>7.7. &#x679A;&#x4E3E; &#x61D2;&#x6C49;&#x6A21;&#x5F0F;</h2>
<pre><code class="lang-text">Java&#x89C4;&#x8303;&#x4E2D;&#x89C4;&#x5B9A;&#xFF0C;&#x6BCF;&#x4E00;&#x4E2A;&#x679A;&#x4E3E;&#x7C7B;&#x578B;&#x6781;&#x5176;&#x5B9A;&#x4E49;&#x7684;&#x679A;&#x4E3E;&#x53D8;&#x91CF;&#x5728;JVM&#x4E2D;&#x90FD;&#x662F;&#x552F;&#x4E00;&#x7684; &#x3002;
&#x5229;&#x7528;&#x679A;&#x4E3E;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x8BA9;JVM&#x6765;&#x5E2E;&#x6211;&#x4EEC;&#x4FDD;&#x8BC1;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x548C;&#x5355;&#x4E00;&#x5B9E;&#x4F8B;&#x7684;&#x95EE;&#x9898;&#x3002;

public class SingletonBean {
    private SingletonBean() { }

    public static SingletonBean getInstance() {
        return EnumHolder.INSTANCE.getInstance();
    }

    private enum EnumHolder {
        INSTANCE;
        private SingletonBean instance = null;

        private EnumHolder() {
            // JVM&#x4FDD;&#x8BC1;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x53EA;&#x8C03;&#x7528;&#x4E00;&#x6B21;
            instance = new SingletonBean();
        }

        private SingletonBean getInstance() {
            return instance;
        }
    }
}
</code></pre>
<h2 id="&#x7C7B;&#x7684;&#x9759;&#x6001;&#x65B9;&#x6CD5;&#x4E5F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;"><a name="&#x7C7B;&#x7684;&#x9759;&#x6001;&#x65B9;&#x6CD5;&#x4E5F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x7C7B;&#x7684;&#x9759;&#x6001;&#x65B9;&#x6CD5;&#x4E5F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>7.8. &#x7C7B;&#x7684;&#x9759;&#x6001;&#x65B9;&#x6CD5;&#x4E5F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;</h2>
<pre><code class="lang-text">&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x53EF;&#x4EE5;&#x5EF6;&#x8FDF;&#x521D;&#x59CB;&#x5316;&#xFF0C;&#x6709;&#x52A9;&#x4E8E;&#x4F18;&#x5316;&#x6027;&#x80FD; &#x3002;
</code></pre>
<h2 id="&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x53CD;&#x5E8F;&#x5217;&#x5316;-&#x7684;&#x95EE;&#x9898;"><a name="&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x53CD;&#x5E8F;&#x5217;&#x5316;-&#x7684;&#x95EE;&#x9898;" class="anchor-navigation-ex-anchor" href="#&#x5355;&#x4F8B;&#x6A21;&#x5F0F;-&#x53CD;&#x5E8F;&#x5217;&#x5316;-&#x7684;&#x95EE;&#x9898;"><i class="fa fa-link" aria-hidden="true"></i></a>7.9. &#x5355;&#x4F8B;&#x6A21;&#x5F0F; &#x53CD;&#x5E8F;&#x5217;&#x5316; &#x7684;&#x95EE;&#x9898;</h2>
<pre><code class="lang-text">&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;&#x4E00;&#x4E2A;&#x7C7B;&#x5B9E;&#x73B0;&#x4E86;Serializable&#x63A5;&#x53E3;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x5C06;&#x5B83;&#x5199;&#x5165;&#x5185;&#x5B58;&#x7136;&#x540E;&#x518D;&#x4ECE;&#x5185;&#x5B58;&#x4E2D;&#x8BFB;&#x53D6;&#x7EC4;&#x88C5;&#x6210;&#x4E00;&#x4E2A;&#x8DDF;&#x539F;&#x6765;&#x4E00;&#x6837;&#x7684;&#x5BF9;&#x8C61;&#x3002;
&#x6B64;&#x65F6;&#xFF0C;&#x5185;&#x5B58;&#x4E2D;&#x5B58;&#x5728;N&#xFF08;N&gt;=2&#xFF09;&#x4E2A;&#x76F8;&#x540C;&#x7684;&#x5BF9;&#x8C61;&#x3002; 
&#x800C;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x8981;&#x6C42;JVM&#x4E2D;&#x53EA;&#x80FD;&#x6709;&#x4E00;&#x4E2A;&#x7C7B;&#x7684;&#x5BF9;&#x8C61;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x505A;&#x7279;&#x6B8A;&#x5904;&#x7406;&#x53CD;&#x5E8F;&#x5217;&#x5C31;&#x4F1A;&#x8FDD;&#x53CD;&#x5355;&#x4F8B;&#x6A21;&#x5F0F;&#x7684;&#x89C4;&#x5219;&#x3002;

/**
 * &#x5B9E;&#x73B0;readResolve&#x65B9;&#x6CD5;&#xFF0C;&#x4E00;&#x4E2A;class&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x63A7;&#x5236;&#x53CD;&#x5E8F;&#x5316;&#x8FD4;&#x56DE;&#x7684;&#x7C7B;&#x578B;&#x548C;&#x5BF9;&#x8C61;&#x5F15;&#x7528;&#x3002;
 * ObjectInputStream &#x4F1A;&#x68C0;&#x67E5;&#x5BF9;&#x8C61;&#x7684;class&#x662F;&#x5426;&#x5B9A;&#x4E49;&#x4E86;readResolve&#x65B9;&#x6CD5;&#x3002;
 * Method readResolveMethod = getInheritableMethod( cl, &quot;readResolve&quot;, null, Object.class);
 */
 private Object readResolve() throws ObjectStreamException {  
            return INSTANCE; //&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x5355;&#x4F8B;&#x5BF9;&#x8C61;&#xFF0C;&#x4E0D;&#x518D;&#x7EC4;&#x88C5;&#x65B0;&#x7684;&#x5BF9;&#x8C61;&#x3002;&#x786E;&#x4FDD;&#x552F;&#x4E00;&#x6027;&#x3002;
     }
</code></pre>
<h1 id="&#x539F;&#x578B;&#x6A21;&#x5F0F;"><a name="&#x539F;&#x578B;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x539F;&#x578B;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>8. &#x539F;&#x578B;&#x6A21;&#x5F0F;</h1>
<pre><code class="lang-text">Prototype Pattern ,&#x539F;&#x578B;&#x6A21;&#x5F0F;&#x7279;&#x70B9; &#x5728;&#x4E8E;&#x901A;&#x8FC7; &#x514B;&#x9686; &#x4E00;&#x4E2A;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x7684;&#x5B9E;&#x4F8B;&#x6765;&#x8FD4;&#x56DE;&#x65B0;&#x7684;&#x5B9E;&#x4F8B;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x65B0;&#x5EFA;&#x5B9E;&#x4F8B;&#x3002;
&#x88AB;&#x590D;&#x5236;&#x7684;&#x5B9E;&#x4F8B;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x6240;&#x79F0;&#x7684;&#x201C;&#x539F;&#x578B;&#x201D;&#x3002;
&#x6A21;&#x578B;&#x9700;&#x8981;&#x5BF9;&#x5916;&#x66B4;&#x9732;&#x81EA;&#x5DF1;&#x5B9E;&#x73B0;&#x7684;&#x514B;&#x9686;&#x63A5;&#x53E3;&#x3002;
&#x5F53;&#x521B;&#x5EFA;&#x65B0;&#x7684;&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;&#x8F83;&#x4E3A;&#x590D;&#x6742;&#x3001;&#x6210;&#x672C;&#x8F83;&#x5927;&#x65F6;&#xFF0C;&#x4F7F;&#x7528;&#x539F;&#x578B;&#x6A21;&#x5F0F;&#x53EF;&#x4EE5;&#x7B80;&#x5316;&#x5BF9;&#x8C61;&#x7684;&#x521B;&#x5EFA;&#x8FC7;&#x7A0B;&#x3001;&#x8282;&#x7EA6;&#x8D44;&#x6E90;&#x3002;

// &#x521B;&#x5EFA;&#x539F;&#x578B;&#x5BF9;&#x8C61;
WeeklyLog log_previous = new WeeklyLog();  
log_previous.setDate(&quot;&#x7B2C;12&#x5468;&quot;);
//&#x8C03;&#x7528;&#x514B;&#x9686;&#x65B9;&#x6CD5;&#x521B;&#x5EFA;&#x514B;&#x9686;&#x5BF9;&#x8C61;
WeeklyLog  log_new = log_previous.clone();
log_new.setDate(&quot;&#x7B2C;13&#x5468;&quot;);
</code></pre>
<h2 id="&#x7F3A;&#x70B9;_2"><a name="&#x7F3A;&#x70B9;_2" class="anchor-navigation-ex-anchor" href="#&#x7F3A;&#x70B9;_2"><i class="fa fa-link" aria-hidden="true"></i></a>8.1. &#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">1&#x3001;&#x9700;&#x8981;&#x4E3A;&#x6BCF;&#x4E00;&#x4E2A;&#x7C7B;&#x914D;&#x5907;&#x4E00;&#x4E2A;&#x514B;&#x9686;&#x65B9;&#x6CD5; &#xFF0C;&#x5F53;&#x5BF9;&#x5DF2;&#x6709;&#x7684;&#x7C7B;&#x8FDB;&#x884C;&#x6539;&#x9020;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x4FEE;&#x6539;&#x6E90;&#x4EE3;&#x7801;&#xFF0C;&#x8FDD;&#x80CC;&#x4E86;&#x201C;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x201D;&#x3002;
2&#x3001;&#x5982;&#x679C;&#x5BF9;&#x8C61;&#x590D;&#x6742;&#xFF0C;&#x5B9E;&#x73B0;&#x6DF1;&#x514B;&#x9686;&#x7684;&#x65F6;&#x5019;&#x8F83;&#x9EBB;&#x70E6;&#x3002;&#xFF08;&#x6BCF;&#x4E00;&#x5C42;&#x5BF9;&#x8C61;&#x5BF9;&#x5E94;&#x7684;&#x7C7B;&#x90FD;&#x5FC5;&#x987B;&#x652F;&#x6301;&#x6DF1;&#x514B;&#x9686;&#xFF09;
</code></pre>
<h1 id="&#x547D;&#x4EE4;&#x6A21;&#x5F0F;-command-pattern"><a name="&#x547D;&#x4EE4;&#x6A21;&#x5F0F;-command-pattern" class="anchor-navigation-ex-anchor" href="#&#x547D;&#x4EE4;&#x6A21;&#x5F0F;-command-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>9. &#x547D;&#x4EE4;&#x6A21;&#x5F0F; Command Pattern</h1>
<table>
<thead>
<tr>
<th>&#x7C7B;&#x578B;</th>
<th>&#x7279;&#x70B9;</th>
</tr>
</thead>
<tbody>
<tr>
<td>&#x547D;&#x4EE4; Command</td>
<td>&#x6709;N&#x79CD;&#x3002;&#x5305;&#x542B;&#x5177;&#x4F53;&#x7684;&#x63A5;&#x6536;&#x8005;&#x3002;</td>
</tr>
<tr>
<td>&#x63A5;&#x6536;&#x8005; Receiver</td>
<td>&#x6709;N&#x79CD; &#x3002;&#x6267;&#x884C;&#x5177;&#x4F53;&#x903B;&#x8F91;&#x7684;&#x5730;&#x65B9; &#x3002;</td>
</tr>
<tr>
<td>&#x8BF7;&#x6C42;&#x8005; Invoker</td>
<td>1&#x79CD; &#x3002; &#x53EA;&#x8D1F;&#x8D23; &#x63A5;&#x6536;&#x547D;&#x4EE4;&#x5E76;&#x8C03;&#x7528;&#x547D;&#x4EE4;&#x7684;&#x6267;&#x884C;&#x65B9;&#x6CD5;&#x3002;</td>
</tr>
</tbody>
</table>
<h2 id="&#x793A;&#x4F8B;_1"><a name="&#x793A;&#x4F8B;_1" class="anchor-navigation-ex-anchor" href="#&#x793A;&#x4F8B;_1"><i class="fa fa-link" aria-hidden="true"></i></a>9.1. &#x793A;&#x4F8B;</h2>
<pre><code class="lang-text">/**&#x8C03;&#x7528;&#x8005; */
public class Invoker{
    /**&#x63A5;&#x6536;&#x5177;&#x4F53;&#x547D;&#x4EE4; &#x5E76;&#x6267;&#x884C;*/
    public void executeCmd(Command command){
        command.execute();
    }
}

/**&#x5177;&#x4F53;&#x7684;&#x547D;&#x4EE4;,&#x4F8B;&#x5982;&#x6253;&#x5F00;&#x8FDE;&#x63A5; */
public class CommandOpenConnection implements Command{
&#x3000;&#x3000;private Receiver receiver;
    /**&#x547D;&#x4EE4; &#x548C; &#x63A5;&#x6536;&#x8005; &#x7ED1;&#x5B9A;*/
&#x3000;&#x3000;public CommandOpenConnection(Receiver receiver) { ...}
    /**&#x6267;&#x884C;&#x547D;&#x4EE4;*/
&#x3000;&#x3000;public void execute() {
&#x3000;&#x3000;   receiver.doSomeThing(...);
&#x3000;&#x3000;}
}

/**&#x5177;&#x4F53;&#x7684;&#x63A5;&#x6536;&#x8005;*/
public class ReceiverOpenConnection implements Receiver{
     public void doSomeThing(...)  {
       &#x5177;&#x4F53;&#x7684;&#x903B;&#x8F91;....  
     }
}

//&#x4F7F;&#x7528;&#x573A;&#x666F;
Receiver receiver=... ;
Invoker invoker = ...;
Command cmd1 = ... ;
//Command cmd2 = ... ;
// &#x8C03;&#x7528;&#x8005; &#x66F4;&#x65B0;&#x547D;&#x4EE4; &#x5E76;&#x53D1;&#x8D77;&#x6267;&#x884C;
invoker.executeCmd(cmd1);
</code></pre>
<h2 id="&#x4F18;&#x7F3A;&#x70B9;_1"><a name="&#x4F18;&#x7F3A;&#x70B9;_1" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x7F3A;&#x70B9;_1"><i class="fa fa-link" aria-hidden="true"></i></a>9.2. &#x4F18;&#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">//&#x4F18;&#x70B9;
1&#x3001;&#x8BF7;&#x6C42;&#x8005;&#xFF08;Invoker&#xFF09; &#x548C;&#x6267;&#x884C;&#x8005;&#xFF08;Receiver&#xFF09; &#x5B8C;&#x5168;&#x89E3;&#x8026;&#x3002;
2&#x3001;&#x6DFB;&#x52A0;&#x65B0;&#x7684;&#x547D;&#x4EE4; &#x7B26;&#x5408; &#x201C;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x201D; &#x3002;
// &#x7F3A;&#x70B9;
1&#x3001;&#x4E00;&#x79CD;&#x547D;&#x4EE4; &#x5BF9;&#x5E94; &#x4E00;&#x4E2A;&#x547D;&#x4EE4;&#x7C7B;(xxx.java)&#x3002;&#x5BFC;&#x81F4; &#x7C7B;&#x4E2A;&#x6570;&#x8FC7;&#x591A; &#x3002;
</code></pre>
<h2 id="&#x547D;&#x4EE4;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><a name="&#x547D;&#x4EE4;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x547D;&#x4EE4;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>9.3. &#x547D;&#x4EE4;&#x6A21;&#x5F0F; &#x548C; &#x7B56;&#x7565;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</h2>
<pre><code class="lang-text">1&#x3001;&#x547D;&#x4EE4;&#x6A21;&#x5F0F; &#x53EA;&#x662F;&#x5F3A;&#x8C03;&#x89E3;&#x8026;&#x5408;&#xFF0C;&#x8C03;&#x7528;&#x8005;&#x53EA;&#x662F;&#x8D1F;&#x8D23;&#x53D1;&#x8D77;&#x8C03;&#x7528;&#x3002;&#x4E0D;&#x540C;&#x7684;&#x547D;&#x4EE4;&#x5F97;&#x5230;&#x4E0D;&#x540C;&#x7684;&#x5904;&#x7406;&#x7ED3;&#x679C; &#x3002;
2&#x3001;&#x7B56;&#x7565;&#x6A21;&#x5F0F; &#x5F3A;&#x8C03; &#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x53EF;&#x4EE5;&#x7528;&#x591A;&#x79CD;&#x7B56;&#x7565;&#x65B9;&#x6CD5;&#x6765; &#x83B7;&#x5F97;&#x76F8;&#x540C;&#x7684;&#x5904;&#x7406;&#x7ED3;&#x679C; &#x3002;
</code></pre>
<h1 id="&#x5907;&#x5FD8;&#x5F55;&#x6A21;&#x5F0F;--memento-pattern--&#x3001;&#x5FEB;&#x7167;&#x6A21;&#x5F0F;"><a name="&#x5907;&#x5FD8;&#x5F55;&#x6A21;&#x5F0F;--memento-pattern--&#x3001;&#x5FEB;&#x7167;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x5907;&#x5FD8;&#x5F55;&#x6A21;&#x5F0F;--memento-pattern--&#x3001;&#x5FEB;&#x7167;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>10. &#x5907;&#x5FD8;&#x5F55;&#x6A21;&#x5F0F;  Memento Pattern  &#x3001;&#x5FEB;&#x7167;&#x6A21;&#x5F0F;</h1>
<pre><code class="lang-text">&#x5728;&#x4E0D;&#x7834;&#x574F;&#x5C01;&#x95ED;&#x7684;&#x524D;&#x63D0;&#x4E0B;&#xFF0C;&#x4FDD;&#x5B58;&#x5BF9;&#x8C61;&#x5F53;&#x524D;&#x72B6;&#x6001;&#xFF0C;&#x5E76;&#x4E14;&#x5728;&#x9700;&#x8981;&#x7684;&#x65F6;&#x5019;&#x53EF;&#x4EE5;&#x518D;&#x6B21;&#x6062;&#x590D;&#x5230;&#x6B64;&#x72B6;&#x6001;&#x3002;
&#x6570;&#x636E;&#x5E93;&#x7684; &#x56DE;&#x6EDA;&#x64CD;&#x4F5C;&#x3001;&#x7F16;&#x8F91;&#x5668;&#x7684; Ctrl+Z&#x6062;&#x590D; &#x90FD;&#x6709;&#x7528;&#x5230; &#x5907;&#x5FD8;&#x5F55;&#x6A21;&#x5F0F;&#x3002;

// &#x5982;&#x4F55;&#x7406;&#x89E3;&#x201C;&#x4E0D;&#x7834;&#x574F;&#x5C01;&#x95ED;&#x7684;&#x524D;&#x63D0;&#x201D;
&#x53D1;&#x8D77;&#x8005;&#x53EA;&#x63D0;&#x4F9B;&#x6709;&#x9650;&#x7684;&#x63A5;&#x53E3;&#xFF08;&#x4FDD;&#x5B58;&#x3001;&#x6062;&#x590D;&#x6570;&#x636E;&#xFF09;&#x3002;&#x4E0D;&#x66B4;&#x9732;&#x5176;&#x4ED6;&#x4E0D;&#x8BE5;&#x66B4;&#x9732;&#x7684;&#x4FE1;&#x606F;&#x3002;
// &#x7F3A;&#x70B9;
&#x6D88;&#x8017;&#x8D44;&#x6E90;

/**&#x53D1;&#x8D77;&#x8005;*/
public class Game{
    private int time; //&#x6E38;&#x620F;&#x5F00;&#x59CB;&#x65F6;&#x95F4;
    private int killPeople; //&#x6E38;&#x620F;&#x4EBA;&#x5934;&#x6570;

    /** &#x5C06;&#x4FE1;&#x606F;&#x4FDD;&#x5B58;&#x5230;&#x5907;&#x5FD8;&#x5F55;*/
    public GameInfo saveGameInfo() {
      GameInfo gameInfo= new GameInfo(time, killPeople);
      return gameInfo;
    }

   // &#x6839;&#x636E;&#x5907;&#x5FD8;&#x5F55; &#x6062;&#x590D; &#x4FE1;&#x606F; &#x3002;
    public void loadGame(GameInfo gameInfo) {
        time = gameInfo.getTime();
        killPeople = gameInfo.getKillPeople();
    }
}

/**&#x5907;&#x5FD8;&#x5F55;&#x89D2;&#x8272; ,&#x4FDD;&#x5B58;&#x6307;&#x5B9A;&#x7684;&#x72B6;&#x6001;&#x4FE1;&#x606F;*/
public class GameInfo{
    private int time;
    private int killPeople;
    public GameInfo(int time, int killPeople)
    { ...  }
}
//&#x4F7F;&#x7528;
Game dota = new Game();
// &#x5C06;&#x72B6;&#x6001;&#x4FDD;&#x5B58;&#x5230;&#x5907;&#x5FD8;&#x5F55;&#x4E2D;
GameInfo info = dota.saveGameInfo();
// &#x6839;&#x636E;&#x5907;&#x5FD8;&#x5F55; &#x6062;&#x590D;&#x6570;&#x636E;
dota.loadGame(info);
</code></pre>
<h1 id="&#x5916;&#x89C2;&#x6A21;&#x5F0F;--facade-pattern-&#x3001;&#x95E8;&#x9762;&#x6A21;&#x5F0F;"><a name="&#x5916;&#x89C2;&#x6A21;&#x5F0F;--facade-pattern-&#x3001;&#x95E8;&#x9762;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x5916;&#x89C2;&#x6A21;&#x5F0F;--facade-pattern-&#x3001;&#x95E8;&#x9762;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>11. &#x5916;&#x89C2;&#x6A21;&#x5F0F;  Facade Pattern &#x3001;&#x95E8;&#x9762;&#x6A21;&#x5F0F;</h1>
<pre><code class="lang-text">&#x6709;&#x4E00;&#x4E2A;&#x7CFB;&#x7EDF; &#x5F88;&#x5927;&#x3001;&#x5F88;&#x590D;&#x6742;&#xFF0C;&#x4EE5;&#x81F3;&#x4E8E;&#x4E00;&#x822C;&#x7684;&#x4EBA;&#x4E0D;&#x4F1A;&#x7528;&#x3002;&#x5373;&#x4F7F;&#x4F1A;&#x7528;&#x4E5F;&#x5F88;&#x9EBB;&#x70E6;&#x3002;
&#x8FD9;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5BF9;&#x8FD9;&#x4E2A;&#x7CFB;&#x7EDF;&#x505A;&#x5C01;&#x88C5; &#xFF0C;&#x8BA9;&#x5927;&#x5BB6;&#x901A;&#x8FC7;&#x5C01;&#x88C5;&#x540E;&#x7684;&#x63A5;&#x53E3;&#x5F88;&#x65B9;&#x4FBF;&#x5730;&#x4F7F;&#x7528;&#x539F;&#x6765;&#x7684;&#x7CFB;&#x7EDF; &#x3002;

&#x5F00;&#x542F;&#x7535;&#x8111; &#x9700;&#x8981;&#x7ECF;&#x8FC7;&#x591A;&#x4E2A;&#x6B65;&#x9AA4;&#xFF0C;&#x63A5;&#x901A;&#x7535;&#x6E90;&#x3001;&#x542F;&#x52A8;BIOS&#x3001;&#x52A0;&#x8F7D;&#x7CFB;&#x7EDF;&#x7B49;&#x7B49;&#x3002;
&#x663E;&#x7136;&#xFF0C;&#x7528;&#x6237;&#x4E0D;&#x9700;&#x8981;&#x53BB;&#x64CD;&#x4F5C;&#x8FD9;&#x4E48;&#x7E41;&#x7410;&#x590D;&#x6742;&#x7684;&#x6D41;&#x7A0B; &#x3002; 
&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x7ED9;&#x7528;&#x6237;&#x66B4;&#x9732;&#x4E86;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x53EA;&#x8981;&#x4E00;&#x6309;&#x5F00;&#x673A;&#x952E; &#x5C31;&#x53EF;&#x4EE5;&#x542F;&#x52A8;&#x7535;&#x8111;&#x4E86; &#x3002;
&#x5927;&#x5927;&#x51CF;&#x5C0F;&#x4E86;&#x7CFB;&#x7EDF;&#x4F7F;&#x7528;&#x7684;&#x590D;&#x6742;&#x5EA6;&#x3002;
</code></pre>
<p><img src="https://gitee.com/hnyer/filesOfGitbook/raw/master/files/201804031414_osChina_&#x5916;&#x89C2;&#x6A21;&#x5F0F;.png" alt=""></p>
<h2 id="&#x7F3A;&#x70B9;_3"><a name="&#x7F3A;&#x70B9;_3" class="anchor-navigation-ex-anchor" href="#&#x7F3A;&#x70B9;_3"><i class="fa fa-link" aria-hidden="true"></i></a>11.1. &#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">1&#x3001;&#x5982;&#x679C;&#x5B50;&#x7CFB;&#x7EDF;&#x505A;&#x4E86;&#x4FEE;&#x6539; &#xFF0C; &#x5916;&#x89C2;&#x7C7B;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x505A;&#x76F8;&#x5E94;&#x4FEE;&#x6539;&#x3002;&#x8FDD;&#x80CC;&#x4E86;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x3002;
</code></pre>
<h2 id="&#x4EE3;&#x7406;&#x6A21;&#x5F0F;-&#x3001;&#x5916;&#x89C2;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><a name="&#x4EE3;&#x7406;&#x6A21;&#x5F0F;-&#x3001;&#x5916;&#x89C2;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x4EE3;&#x7406;&#x6A21;&#x5F0F;-&#x3001;&#x5916;&#x89C2;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>11.2. &#x4EE3;&#x7406;&#x6A21;&#x5F0F; &#x3001;&#x5916;&#x89C2;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</h2>
<pre><code class="lang-text">1&#x3001;&#x4FA7;&#x91CD;&#x70B9;&#x4E0D;&#x540C;&#xFF0C; &#x4EE3;&#x7406;&#x5F3A;&#x8C03; &#x4E0D;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x539F;&#x7CFB;&#x7EDF;&#xFF08;&#x56E0;&#x4E3A;&#x6743;&#x9650;&#x7B49;&#xFF09; &#x3002; &#x5916;&#x89C2;&#x6A21;&#x5F0F; &#x5F3A;&#x8C03; &#x590D;&#x6742;&#x7CFB;&#x7EDF;&#x7684;&#x7B80;&#x5316;&#x3002;
</code></pre>
<h1 id="&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-builder-pattern"><a name="&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-builder-pattern" class="anchor-navigation-ex-anchor" href="#&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-builder-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>12. &#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F; Builder Pattern</h1>
<pre><code class="lang-text">&#x9002;&#x7528;&#x4E8E; &#x6784;&#x5EFA;&#x6D41;&#x7A0B;&#x975E;&#x5E38;&#x590D;&#x6742;&#x7684; &#x5BF9;&#x8C61;&#x3002;

&#x5C06;&#x4E00;&#x4E2A;&#x590D;&#x6742;&#x5BF9;&#x8C61;&#x7684;&#x6784;&#x9020;&#x4E0E;&#x5B83;&#x7684;&#x8868;&#x793A;&#x5206;&#x79BB;&#xFF0C;&#x4F7F;&#x540C;&#x6837;&#x7684;&#x6784;&#x5EFA;&#x8FC7;&#x7A0B;&#x53EF;&#x4EE5;&#x521B;&#x5EFA;&#x4E0D;&#x540C;&#x7684;&#x8868;&#x793A;&#x3002;
1&#x3001;&#x5BF9;&#x8C61;&#x7684;&#x6784;&#x5EFA;&#xFF1A;&#x5BF9;&#x8C61;&#x7684;&#x7EC4;&#x88C5;&#x751F;&#x6210;&#x8FC7;&#x7A0B;&#x3002;
2&#x3001;&#x5BF9;&#x8C61;&#x7684;&#x8868;&#x793A;&#xFF1A;&#x4EA7;&#x54C1;&#x672C;&#x8EAB;&#x3002;&#x4EA7;&#x54C1;&#x7684;&#x7279;&#x6027;&#x3002;
3&#x3001;&#x540C;&#x6837;&#x7684;&#x521B;&#x5EFA;&#x8FC7;&#x7A0B;&#xFF1A;&#x6307;&#x6325;&#x8005;&#x4E2D;&#x5B9A;&#x4E49;&#x7684;&#x521B;&#x5EFA;&#x7684;&#x76F8;&#x540C;&#x6D41;&#x7A0B;&#x3002;
4&#x3001;&#x521B;&#x5EFA;&#x4E0D;&#x540C;&#x7684;&#x8868;&#x793A;&#xFF1A;&#x4E0D;&#x540C;&#x7684;&#x521B;&#x5EFA;&#x7EC6;&#x8282;&#x533A;&#x5206;&#x5728;&#x6784;&#x5EFA;&#x8005;&#x5F53;&#x4E2D;&#xFF0C;&#x8C03;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x6784;&#x5EFA;&#x8005;&#x4F1A;&#x6709;&#x4E0D;&#x540C;&#x7684;&#x7ED3;&#x679C;&#x3002;
</code></pre>
<h2 id="&#x5177;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#xFF08;&#x5B8C;&#x6574;&#x6A21;&#x5F0F;&#xFF09;"><a name="&#x5177;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#xFF08;&#x5B8C;&#x6574;&#x6A21;&#x5F0F;&#xFF09;" class="anchor-navigation-ex-anchor" href="#&#x5177;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#xFF08;&#x5B8C;&#x6574;&#x6A21;&#x5F0F;&#xFF09;"><i class="fa fa-link" aria-hidden="true"></i></a>12.1. &#x5177;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F; &#xFF08;&#x5B8C;&#x6574;&#x6A21;&#x5F0F;&#xFF09;</h2>
<pre><code class="lang-text">// &#x5177;&#x4F53;&#x7684;&#x6784;&#x5EFA;&#x8005; &#x53EA;&#x8D1F;&#x8D23; &#x6700;&#x540E;&#x7684;&#x6784;&#x5EFA;&#x7EC6;&#x8282;&#x3002;
// &#x4E0D;&#x8D1F;&#x8D23;&#x8FD9;&#x4E9B;&#x7EC6;&#x8282;&#x5982;&#x4F55;&#x7EC4;&#x88C5;
class DevilBuilder extends ActorBuilder{
   public  void buildType() { ...}
   public  void buildSex()  { ... }
   public  void buildFace() { ... }
   public  void buildCostume() {...}
   public  void buildHairstyle() {...}
}

// &#x6307;&#x6325;&#x8005; &#x53EA;&#x8D1F;&#x8D23;&#x6784;&#x5EFA;&#x987A;&#x5E8F;
class ActorController{
   public  Product getProduct(ActorBuilder ab)  {
          ab.buildType();
          ...
          ab.buildCostume();
          // Product&#x5728;ActorBuilder&#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4E2D;&#x521B;&#x5EFA;&#x597D;
          return ab.createAProduct();
   }
}

//&#x6D4B;&#x8BD5;
// &#x6784;&#x5EFA;&#x987A;&#x5E8F;&#x5B9A;&#x4E49;&#x5728; ActorController &#x4E2D;
ActorController controller = ...;
// &#x4EA7;&#x54C1;&#x4E0D;&#x540C;&#x90E8;&#x4F4D;&#x7684;&#x6784;&#x5EFA;&#x80FD;&#x529B; &#x5B9A;&#x4E49;&#x5728; builer &#x4E2D;
ActorBuilder  builer=...;
//&#x6839;&#x636E;&#x6784;&#x5EFA;&#x8005;&#x4E0D;&#x540C;&#x8FD4;&#x56DE;&#x4EA7;&#x54C1;&#x4E0D;&#x540C;
Product product = controller.getProduct(builer);
</code></pre>
<h2 id="&#x6CA1;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;&#xFF08;&#x7B80;&#x7565;&#x6A21;&#x5F0F;&#xFF09;"><a name="&#x6CA1;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;&#xFF08;&#x7B80;&#x7565;&#x6A21;&#x5F0F;&#xFF09;" class="anchor-navigation-ex-anchor" href="#&#x6CA1;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;&#xFF08;&#x7B80;&#x7565;&#x6A21;&#x5F0F;&#xFF09;"><i class="fa fa-link" aria-hidden="true"></i></a>12.2. &#x6CA1;&#x6709;&#x6307;&#x6325;&#x8005;&#x7684;&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;&#xFF08;&#x7B80;&#x7565;&#x6A21;&#x5F0F;&#xFF09;</h2>
<p>&#x6784;&#x5EFA;&#x987A;&#x5E8F; &#x548C;&#x6784;&#x5EFA;&#x80FD;&#x529B; &#x5168;&#x90E8;&#x5B9A;&#x4E49;&#x5728; ActorBuilder &#x4E2D;</p>
<pre><code class="lang-text">class DevilBuilder extends ActorBuilder{
   public  void buildType() { ...}
   public  void buildSex()  { ... }
   public  void buildFace() { ... }
   public  void buildCostume() {...}
   public  void buildHairstyle() {...}

   public  Product getProduct()  {
        buildType();
        ...
        buildCostume();
        return createAProduct();
   }
}
</code></pre>
<h2 id="&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x5DE5;&#x5382;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><a name="&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x5DE5;&#x5382;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x5DE5;&#x5382;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>12.3. &#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F; &#x548C; &#x5DE5;&#x5382;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</h2>
<pre><code class="lang-text">&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x4E0E; &#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;&#x7684;&#x5B8C;&#x6574;&#x6A21;&#x5F0F;&#x76F8;&#x6BD4;&#xFF0C;&#x5C31;&#x591A;&#x4E86;&#x4E00;&#x4E2A; &#x6307;&#x6325;&#x8005;&#x3002; 
&#x4E0D;&#x540C;&#x7684;&#x6784;&#x5EFA;&#x8005;&#x7684; &#x6784;&#x5EFA;&#x6D41;&#x7A0B; &#x62BD;&#x8C61;&#x51FA;&#x6765;&#x653E;&#x5728;&#x4E00;&#x8D77;&#x4E86;&#x3002;  &#x4E0E;&#x7B80;&#x7565;&#x6A21;&#x5F0F;&#x76F8;&#x6BD4;&#xFF0C;&#x6211;&#x611F;&#x89C9;&#x6CA1;&#x5565;&#x533A;&#x522B;&#x3002;
</code></pre>
<h2 id="&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><a name="&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>12.4. &#x5EFA;&#x9020;&#x8005;&#x6A21;&#x5F0F; &#x548C; &#x7B56;&#x7565;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</h2>
<pre><code class="lang-text">&#x4E2A;&#x4EBA;&#x611F;&#x89C9;&#x53EA;&#x662F;&#x5B9A;&#x4E49;&#x7684;&#x51FA;&#x53D1;&#x70B9;&#x4E0D;&#x540C;&#x3002; 
&#x4ECE;&#x5F62;&#x5F0F;&#x4E0A;&#x770B;&#xFF0C;&#x90FD;&#x662F;&#x6839;&#x636E;&#x4F20;&#x5165;&#x4E0D;&#x540C;&#x7684;&#x7B56;&#x7565;&#xFF0C;&#x83B7;&#x5F97;&#x4E0D;&#x540C;&#x7684;&#x7ED3;&#x679C;&#x3002;&#xFF08;&#x4E00;&#x79CD;&#x6784;&#x5EFA;&#x8005;&#x53EF;&#x4EE5;&#x770B;&#x505A;&#x4E00;&#x79CD;&#x7B56;&#x7565;&#xFF09;
</code></pre>
<h1 id="&#x6865;&#x63A5;&#x6A21;&#x5F0F;-bridge-pattern"><a name="&#x6865;&#x63A5;&#x6A21;&#x5F0F;-bridge-pattern" class="anchor-navigation-ex-anchor" href="#&#x6865;&#x63A5;&#x6A21;&#x5F0F;-bridge-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>13. &#x6865;&#x63A5;&#x6A21;&#x5F0F; Bridge Pattern</h1>
<pre><code class="lang-text">&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x7C7B;&#x6709;&#x591A;&#x4E2A;&#x53D8;&#x5316;&#x7EF4;&#x5EA6;&#x3002;&#x6B64;&#x65F6;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7EE7;&#x627F;&#x7684;&#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x7EC4;&#x5408; &#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x6837;&#x4F1A;&#x4EA7;&#x751F;&#x5927;&#x91CF;&#x7684;&#x6D3E;&#x751F;&#x7C7B; &#x624D;&#x80FD;&#x6EE1;&#x8DB3;&#x8981;&#x6C42;&#x3002;
&#x6B64;&#x65F6;&#x6211;&#x4EEC;&#x7684;&#x6865;&#x63A5;&#x6A21;&#x5F0F;&#xFF0C;&#x91C7;&#x7528;&#x805A;&#x5408;&#x800C;&#x975E;&#x7EE7;&#x627F;&#x7684;&#x65B9;&#x5F0F; &#x4E5F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x540C;&#x6837;&#x7684;&#x6548;&#x679C;&#x3002;&#x4F46;&#x662F;&#x9700;&#x8981;&#x7684;&#x6D3E;&#x751F;&#x7C7B;&#x5C31;&#x5927;&#x5927;&#x51CF;&#x5C11;&#x4E86;&#x3002;
</code></pre>
<h2 id="&#x62BD;&#x8C61;&#x90E8;&#x5206;-&#x3001;&#x5B9E;&#x73B0;&#x90E8;&#x5206;"><a name="&#x62BD;&#x8C61;&#x90E8;&#x5206;-&#x3001;&#x5B9E;&#x73B0;&#x90E8;&#x5206;" class="anchor-navigation-ex-anchor" href="#&#x62BD;&#x8C61;&#x90E8;&#x5206;-&#x3001;&#x5B9E;&#x73B0;&#x90E8;&#x5206;"><i class="fa fa-link" aria-hidden="true"></i></a>13.1. &#x62BD;&#x8C61;&#x90E8;&#x5206; &#x3001;&#x5B9E;&#x73B0;&#x90E8;&#x5206;</h2>
<p>&#x6982;&#x5FF5;&#x53C2;&#x8003;&#x81EA;<a href="https://blog.csdn.net/lovelion/article/details/7464195" target="_blank">&#x5218;&#x4F1F;</a> &#x3002;</p>
<pre><code class="lang-text">&#x5047;&#x5982;&#x4E00;&#x4E2A;&#x7C7B;&#x6709;&#x4E24;&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x7EAC;&#x5EA6;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x4E0E;&#x8FD9;&#x4E2A;&#x7C7B;&#x5173;&#x7CFB;&#x6700;&#x5BC6;&#x5207;&#x3001;&#x6700;&#x672C;&#x8D28;&#x7684;&#x90A3;&#x4E2A;&#x7EAC;&#x5EA6; &#x79F0;&#x4E4B;&#x4E3A; &#x201C;&#x62BD;&#x8C61;&#x90E8;&#x5206;&#x201D;&#x3002;
&#x800C;&#x53E6;&#x5916;&#x7684;&#x4E00;&#x4E2A;&#x7EAC;&#x5EA6;&#x79F0;&#x4E4B;&#x4E3A;&#x201C;&#x5B9E;&#x73B0;&#x90E8;&#x5206;&#x201D; &#x3002;
&#x4F8B;&#x5982; &#x4E00;&#x652F;&#x6BDB;&#x7B14;&#xFF0C;&#x6709;&#x201C;&#x5927;&#x5C0F;&#x578B;&#x53F7;&#x201D; &#x548C;&quot;&#x80FD;&#x7ED8;&#x5236;&#x7684;&#x989C;&#x8272;&quot; &#x4E24;&#x4E2A;&#x7EAC;&#x5EA6; &#x3002;
&#x56E0;&#x4E3A;&#x6BDB;&#x7B14;&#x4E00;&#x65E6;&#x751F;&#x4EA7;&#x5B83;&#x7684;&#x5927;&#x5C0F;&#x578B;&#x53F7;&#x5C31;&#x5DF2;&#x7ECF;&#x88AB;&#x56FA;&#x5B9A;&#x4E86;&#xFF0C;&#x800C;&#x80FD;&#x7ED8;&#x5236;&#x7684;&#x989C;&#x8272;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x6CBE;&#x67D3;&#x7684;&#x6D82;&#x6599;&#x4E0D;&#x540C;&#x800C;&#x53D8;&#x5316;&#x3002; 
&#x6240;&#x4EE5;&#xFF0C; &#x201C;&#x578B;&#x53F7;&#x201D;&#x8FD9;&#x4E2A;&#x7EAC;&#x5EA6;&#x5212;&#x5206;&#x4E3A; &#x201C;&#x62BD;&#x8C61;&#x90E8;&#x5206;&#x201D; &#xFF0C;&#x201C;&#x989C;&#x8272;&#x201D;&#x5212;&#x5206;&#x4E3A; &#x201C;&#x5B9E;&#x73B0;&#x90E8;&#x5206;&#x201D; &#x3002;
</code></pre>
<h2 id="&#x793A;&#x610F;&#x56FE;"><a name="&#x793A;&#x610F;&#x56FE;" class="anchor-navigation-ex-anchor" href="#&#x793A;&#x610F;&#x56FE;"><i class="fa fa-link" aria-hidden="true"></i></a>13.2. &#x793A;&#x610F;&#x56FE;</h2>
<p>&#x91C7;&#x7528;&#x7EE7;&#x627F;&#x7684;&#x65B9;&#x5F0F;&#x53BB;&#x5B9E;&#x73B0;&#x6548;&#x679C;&#x3002;&#x9700;&#x8981;&#x8F83;&#x591A;&#x7684;&#x6D3E;&#x751F;&#x7C7B;&#x3002; 
<img src="https://gitee.com/hnyer/filesOfGitbook/raw/master/files/201804111503_osChina_&#x7EE7;&#x627F;&#x6A21;&#x5F0F;.png" alt=""></p>
<p>&#x91C7;&#x7528;&#x6865;&#x63A5;&#x7684;&#x65B9;&#x5F0F;&#x53BB;&#x5B9E;&#x73B0;&#x6548;&#x679C;&#x3002;&#x578B;&#x53F7;&#x548C;&#x989C;&#x8272;&#x4E92;&#x76F8;&#x7EC4;&#x5408;&#x5373;&#x53EF;&#x5B9E;&#x73B0;&#x3002;
<img src="https://gitee.com/hnyer/filesOfGitbook/raw/master/files/201804111504_osChina_&#x6865;&#x63A5;&#x6A21;&#x5F0F;.png" alt=""></p>
<h2 id="demo"><a name="demo" class="anchor-navigation-ex-anchor" href="#demo"><i class="fa fa-link" aria-hidden="true"></i></a>13.3. demo</h2>
<pre><code class="lang-text">//&#x5B9E;&#x73B0;&#x90E8;&#x5206;
public class Color{
    String color=&quot;&quot;;
    public Color(String color) {...}
}
// &#x62BD;&#x8C61;&#x90E8;&#x5206;
public class Size {
    Color color;
    String size =&quot;&#x5927;&#x53F7;&quot; ;
    public Size(Color color){...}
    public void disPlay() {
        System.out.println(size+&quot; &quot;+ color.color+ &quot;  &#x7B14;&quot;);
    }
}
//&#x7EC4;&#x5408;
Color white =new Color(&quot;&#x767D;&#x8272; &quot;);
Size size = new Size(white);
size.disPlay();
//&#x83B7;&#x5F97; &#x5927;&#x53F7;&#x767D;&#x8272;&#x7B14;
</code></pre>
<h1 id="&#x6A21;&#x677F;&#x6A21;&#x5F0F;-&#x3001;&#x6A21;&#x677F;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;-&#x3001;template-method-pattern"><a name="&#x6A21;&#x677F;&#x6A21;&#x5F0F;-&#x3001;&#x6A21;&#x677F;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;-&#x3001;template-method-pattern" class="anchor-navigation-ex-anchor" href="#&#x6A21;&#x677F;&#x6A21;&#x5F0F;-&#x3001;&#x6A21;&#x677F;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;-&#x3001;template-method-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>14. &#x6A21;&#x677F;&#x6A21;&#x5F0F; &#x3001;&#x6A21;&#x677F;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F; &#x3001;Template Method Pattern</h1>
<pre><code class="lang-text">&#x6A21;&#x677F;&#x65B9;&#x6CD5;&#x4F7F;&#x5F97;&#x5B50;&#x7C7B;&#x53EF;&#x4EE5;&#x5728;&#x4E0D;&#x6539;&#x53D8;&#x7B97;&#x6CD5;&#x7ED3;&#x6784;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x91CD;&#x65B0;&#x5B9A;&#x4E49;&#x7B97;&#x6CD5;&#x4E2D;&#x7684;&#x67D0;&#x4E9B;&#x6B65;&#x9AA4;&#x3002;
&#x4E3A;&#x9632;&#x6B62;&#x6076;&#x610F;&#x64CD;&#x4F5C;&#xFF0C;&#x4E00;&#x822C;&#x6A21;&#x677F;&#x65B9;&#x6CD5;&#x90FD;&#x52A0;&#x4E0A; final &#x9632;&#x7BE1;&#x6539;&#x3002;
</code></pre>
<h2 id="demo_1"><a name="demo_1" class="anchor-navigation-ex-anchor" href="#demo_1"><i class="fa fa-link" aria-hidden="true"></i></a>14.1. demo</h2>
<pre><code class="lang-text">/**&#x62BD;&#x8C61;&#x7C7B;*/
public abstract class AbstractComputer{
    /**&#x5F00;&#x673A;*/
    protected void powerOn()
     { ...  }
    /**&#x5E38;&#x89C4;&#x786C;&#x4EF6;&#x68C0;&#x67E5;*/
    protected void checkHardware()
    { ...}
    /**&#x52A0;&#x8F7D; &#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;*/
    protected void loadOS()
    { ...}
    /**&#x9ED8;&#x8BA4;&#x65E0;&#x5BC6;&#x7801;&#x9A8C;&#x8BC1;&#xFF0C;&#x76F4;&#x63A5;&#x8FDB;&#x5165;&#x7CFB;&#x7EDF;*/
    protected void login()
     { ... }
    // &#x6A21;&#x677F;&#x65B9;&#x6CD5;&#xFF0C;&#x7528; final&#x4FEE;&#x9970;&#xFF0C;&#x9632;&#x6B62;&#x88AB;&#x7BE1;&#x6539; &#x7B97;&#x6CD5;&#x6D41;&#x7A0B;&#x3002;
    public final void startUp() {
        //&#x516C;&#x5171;&#x65B9;&#x6CD5;
        powerOn();
        //&#x6709;&#x5DEE;&#x5F02;&#x6027;&#x7684;&#x65B9;&#x6CD5;
        checkHardware();
        //&#x516C;&#x5171;&#x65B9;&#x6CD5;
        loadOS();
        //&#x6709;&#x5DEE;&#x5F02;&#x6027;&#x7684;&#x65B9;&#x6CD5;
        login();
    }
}

// &#x7A0B;&#x5E8F;&#x5458;&#x7684;&#x7535;&#x8111;  
CoderComputer extends AbstractComputer...
@Override
 protected void login() {
   // &#x9A8C;&#x8BC1;&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;
 }
 //&#x519B;&#x7528;&#x8BA1;&#x7B97;&#x673A;
 class MilitaryComputer extends AbstractComputer...
 @Override
protected void checkHardware(){
  //&#x8FDB;&#x884C; &#x786C;&#x4EF6;&#x9632;&#x706B;&#x5899; &#x7B49;&#x5B89;&#x5168;&#x8BBE;&#x5907;&#x662F;&#x5426;&#x6B63;&#x5E38;
  ...
}
@Override
protected void login(){
  //&#x9A8C;&#x8BC1; &#x6307;&#x7EB9; &#x3001; &#x7528;&#x6237;&#x540D;&#x3001;&#x5BC6;&#x7801;&#x7B49;
}
</code></pre>
<h1 id="&#x72B6;&#x6001;&#x6A21;&#x5F0F;-state-pattern"><a name="&#x72B6;&#x6001;&#x6A21;&#x5F0F;-state-pattern" class="anchor-navigation-ex-anchor" href="#&#x72B6;&#x6001;&#x6A21;&#x5F0F;-state-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>15. &#x72B6;&#x6001;&#x6A21;&#x5F0F; State Pattern</h1>
<pre><code class="lang-text">&#x67D0;&#x79CD;&#x4E1A;&#x52A1;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x786E;&#x5B9E;&#x53EF;&#x4EE5;&#x7528; if  else &#x6765;&#x5B8C;&#x6210; &#xFF0C;
&#x4F46;&#x662F;&#x7531;&#x4E8E; &#x4E0D;&#x540C;&#x72B6;&#x6001;&#x4E0B;&#x7684;&#x5904;&#x7406;&#x65B9;&#x6CD5;&#x4E0D;&#x4E00;&#x6837;&#x3002;&#x4F1A;&#x5BFC;&#x81F4;&#x5927;&#x91CF;&#x7684; if  else &#x4EE3;&#x7801;&#x3002; 
&#x4F1A;&#x9020;&#x6210;&#x4EE3;&#x7801;&#x590D;&#x6742;&#xFF0C;&#x4E0D;&#x6613;&#x7EF4;&#x62A4;&#x7B49;&#x95EE;&#x9898;&#x3002; &#x6B64;&#x65F6;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x7528; &#x72B6;&#x6001;&#x6A21;&#x5F0F; &#x89E3;&#x51B3;&#x3002;
</code></pre>
<h2 id="demo_2"><a name="demo_2" class="anchor-navigation-ex-anchor" href="#demo_2"><i class="fa fa-link" aria-hidden="true"></i></a>15.1. demo</h2>
<p>&#x4E00;&#x4E2A;&#x8BA2;&#x5355;&#x7684;&#x72B6;&#x6001;&#xFF1A; &#x672A;&#x652F;&#x4ED8;&#x3001;&#x6B63;&#x5728;&#x652F;&#x4ED8;&#x3001;&#x5DF2;&#x652F;&#x4ED8;&#x3001;&#x7533;&#x8BF7;&#x9000;&#x6B3E;&#xFF0C;&#x9000;&#x6B3E;&#x4E2D;&#xFF0C;&#x9000;&#x6B3E;&#x5B8C;&#x6210;</p>
<pre><code class="lang-text">//&#x76F4;&#x63A5;&#x91C7;&#x7528;&#x7B80;&#x5355;&#x7684; if else &#x65B9;&#x5F0F;
public void &#x652F;&#x4ED8;&#xFF08;&#xFF09;{
  if(&#x672A;&#x652F;&#x4ED8;){
    //&#x5904;&#x7406; &#x652F;&#x4ED8;&#x64CD;&#x4F5C;
  }
  else if(&#x6B63;&#x5728;&#x652F;&#x4ED8;){
    //&#x63D0;&#x793A; &#x4E0D;&#x7B26;&#x5408;&#x64CD;&#x4F5C;&#x6761;&#x4EF6;&#x3002;
  }
  else if(&#x9000;&#x6B3E;&#x5B8C;&#x6210;){
  //&#x63D0;&#x793A; &#x4E0D;&#x7B26;&#x5408;&#x64CD;&#x4F5C;&#x6761;&#x4EF6;&#x3002;
  }
}

public void &#x9000;&#x6B3E;&#xFF08;&#xFF09;{
  if(&#x672A;&#x652F;&#x4ED8;){
   //&#x63D0;&#x793A; &#x4E0D;&#x7B26;&#x5408;&#x64CD;&#x4F5C;&#x6761;&#x4EF6;&#x3002;
  }else if(&#x6B63;&#x5728;&#x652F;&#x4ED8;){
   //&#x63D0;&#x793A; &#x4E0D;&#x7B26;&#x5408;&#x64CD;&#x4F5C;&#x6761;&#x4EF6;&#x3002;
  } else if(&#x9000;&#x6B3E;&#x5B8C;&#x6210;){
   //&#x63D0;&#x793A; &#x4E0D;&#x7B26;&#x5408;&#x64CD;&#x4F5C;&#x6761;&#x4EF6;&#x3002;
  }else if(&#x5DF2;&#x652F;&#x4ED8;){
    // &#x5904;&#x7406;&#x9000;&#x6B3E;&#x64CD;&#x4F5C;..
  }
}
//&#x5982;&#x679C;&#x8981;&#x65B0;&#x589E; &#x4E00;&#x4E2A; &quot;&#x9000;&#x6B3E;&#x5BA1;&#x6838;&quot;&#x72B6;&#x6001; &#x3002;
//&#x6B64;&#x65F6;&#x9700;&#x8981;&#x53BB;&#x4FEE;&#x6539;&#x4EE5;&#x4E0A;&#x6240;&#x6709;&#x7684; if else ,&#x4E25;&#x91CD;&#x7834;&#x574F; &#x5F00;&#x95ED;&#x539F;&#x5219; &#x3002;

//&#x91C7;&#x7528;&#x72B6;&#x6001;&#x6A21;&#x5F0F;
/**&#x672A;&#x652F;&#x4ED8;&#x72B6;&#x6001;*/
public class NoPayStatus  {
    public NoPayStatus(Order order,String name){
        //&#x521D;&#x59CB;&#x5316;&#x8BA2;&#x5355;&#x4FE1;&#x606F;
    }

    public OrderStatus processOrder(Order order) {
        //&#x5904;&#x7406;&#x5F53;&#x524D;&#x72B6;&#x6001;&#x4E0B;&#x7684;&#x8BA2;&#x5355;&#xFF0C;
        ...
        //&#x6839;&#x636E;&#x5904;&#x7406;&#x7ED3;&#x679C;&#xFF0C;&#x8BBE;&#x7F6E;&#x8BA2;&#x5355;&#x65B0;&#x7684;&#x72B6;&#x6001;
        OrderStatus state=new PayStatus(order,&quot;&#x5DF2;&#x652F;&#x4ED8;&quot;);
        order.setStatus(state);
        return state;
    }
}

/**&#x7533;&#x8BF7;&#x9000;&#x6B3E;*/
public class ApplyDrawbackStatus  {
  private Order order;
  private String name;
    public ApplyDrawbackStatus(Order order, String name)   {
       //&#x521D;&#x59CB;&#x5316;&#x8BA2;&#x5355;&#x4FE1;&#x606F;
    }

    @Override
    public OrderStatus processOrder(Order order)  {
        //&#x5904;&#x7406;&#x5F53;&#x524D;&#x72B6;&#x6001;&#x4E0B;&#x7684;&#x8BA2;&#x5355;&#xFF0C;
        ...
       //&#x6839;&#x636E;&#x5904;&#x7406;&#x7ED3;&#x679C;&#xFF0C;&#x8BBE;&#x7F6E;&#x8BA2;&#x5355;&#x65B0;&#x7684;&#x72B6;&#x6001;
        return new DrawbackStatus(order, &quot;&#x8BA2;&#x5355;&#x56DE;&#x6B3E;&#x4E2D;&quot;);
    }
}
//&#x4F7F;&#x7528;&#x573A;&#x666F;
//&#x67D0;&#x4E2A;&#x65F6;&#x523B;&#x6839;&#x636E;&#x60C5;&#x51B5;&#x6839;&#x636E;&#x5177;&#x4F53;&#x60C5;&#x51B5;&#x7ED9;&#x8BA2;&#x5355;&#x8BBE;&#x7F6E;&#x72B6;&#x6001;
Order order=new Order();
order.setStatus( &#x67D0;&#x4E2A;&#x72B6;&#x6001;);
....
//&#x5728;&#x53E6;&#x4E00;&#x4E2A;&#x65F6;&#x523B;&#xFF0C;&#x5904;&#x7406;&#x8BA2;&#x5355;&#x3002;
OrderStatus status=order.getStatus();
status.processOrder(order);
</code></pre>
<h2 id="&#x7F3A;&#x70B9;_4"><a name="&#x7F3A;&#x70B9;_4" class="anchor-navigation-ex-anchor" href="#&#x7F3A;&#x70B9;_4"><i class="fa fa-link" aria-hidden="true"></i></a>15.2. &#x7F3A;&#x70B9;</h2>
<p>&#x5E76;&#x6CA1;&#x6709;&#x5B8C;&#x5168;&#x7B26;&#x5408; &#x5F00;&#x95ED;&#x539F;&#x5219;</p>
<pre><code class="lang-text">@Override
public OrderStatus processOrder(Order order){
  //&#x5982;&#x679C;&#x8981;&#x65B0;&#x589E; &#x4E00;&#x4E2A; &quot;&#x9000;&#x6B3E;&#x5BA1;&#x6838;&quot;&#x72B6;&#x6001; &#x3002;
  //&#x4E5F;&#x9700;&#x8981;&#x4FEE;&#x6539;&#x76F8;&#x5173;&#x4EE3;&#x7801;
  //return new DrawbackStatus(order, &quot;&#x8BA2;&#x5355;&#x56DE;&#x6B3E;&#x4E2D;&quot;);
  return new CheckDrawbackStatus(order, &quot;&#x9000;&#x6B3E;&#x5BA1;&#x6838;&#x4E2D;&quot;);
}
</code></pre>
<h2 id="&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x548C;-&#x72B6;&#x6001;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><a name="&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x548C;-&#x72B6;&#x6001;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x548C;-&#x72B6;&#x6001;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>15.3. &#x7B56;&#x7565;&#x6A21;&#x5F0F; &#x548C; &#x72B6;&#x6001;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</h2>
<pre><code class="lang-text">1&#x3001;&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x53EA;&#x662F;&#x4E00;&#x4E2A;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x7684;&#x5C01;&#x88C5; &#x3002;&#x91CD;&#x5728;&#x5916;&#x90E8;&#x5BF9;&#x7B56;&#x7565;&#x7684;&#x9009;&#x62E9;&#x6216;&#x52A8;&#x6001;&#x7684;&#x5207;&#x6362;&#x3002;&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x6BCF;&#x4E2A;&#x7B97;&#x6CD5;&#x662F;&#x76F8;&#x5BF9;&#x72EC;&#x7ACB;&#x7684;&#x3002;
2&#x3001;&#x72B6;&#x6001;&#x6A21;&#x5F0F;&#x662F;&#x521D;&#x59CB;&#x5316;&#x4E00;&#x4E2A;&#x72B6;&#x6001;&#xFF0C;&#x4E4B;&#x540E;&#x7684;&#x6BCF;&#x4E2A;&#x72B6;&#x6001;&#x7684;&#x53D8;&#x5316;&#x90FD;&#x4F1A;&#x6307;&#x5B9A;&#x4E0B;&#x4E00;&#x4E2A;&#x72B6;&#x6001;&#x3002;&#x72B6;&#x6001;&#x6A21;&#x5F0F;&#x4E2D;&#x6BCF;&#x4E2A;&#x72B6;&#x6001;&#x662F;&#x5B58;&#x5728;&#x76F8;&#x4E92;&#x8F6C;&#x5316;&#x7684;&#xFF0C;
</code></pre>
<h1 id="&#x7B56;&#x7565;&#x6A21;&#x5F0F;--strategy-pattern"><a name="&#x7B56;&#x7565;&#x6A21;&#x5F0F;--strategy-pattern" class="anchor-navigation-ex-anchor" href="#&#x7B56;&#x7565;&#x6A21;&#x5F0F;--strategy-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>16. &#x7B56;&#x7565;&#x6A21;&#x5F0F;  Strategy Pattern</h1>
<h2 id="demo_3"><a name="demo_3" class="anchor-navigation-ex-anchor" href="#demo_3"><i class="fa fa-link" aria-hidden="true"></i></a>16.1. demo</h2>
<pre><code class="lang-text">/**&#x62BD;&#x8C61;&#x63A5;&#x53E3;&#xFF0C;&#x5B9A;&#x4E49;&#x5171;&#x540C;&#x64CD;&#x4F5C;*/
public interface Strategy{
    public double getValue(double paramA, double paramB);
}
// &#x52A0;&#x6CD5;&#x7B56;&#x7565;
public class AddStrategy implements Strategy{
    @Override
    public double getValue(double paramA, double paramB){
        return paramA + paramB;
    }
}//
// &#x51CF;&#x6CD5;&#x7B56;&#x7565;
public class SubStrategy implements Strategy{
    @Override
    public double getValue(double paramA, double paramB){
        return paramA - paramB;
    }
}//

// &#x8F85;&#x52A9;&#x7C7B;&#x3002;&#x6839;&#x636E;&#x4F20;&#x5165;&#x7684;&#x7B56;&#x7565;&#x7C7B;&#x578B;&#x8FD4;&#x56DE;&#x8BA1;&#x7B97;&#x7ED3;&#x679C;&#x3002; 
public class CalcClient{
    private Strategy strategy;
    public void setStrategy(Strategy strategy){
        this.strategy = strategy;
    }
    public double calc(double paramA, double paramB){
        return this.strategy.getValue(paramA, paramB);
    }
}

public static void main(String[] args){
    double paramA = 5;
    double paramB = 21;
    //&#x7528;if-else&#x5B9E;&#x73B0; &#xFF08; &#x666E;&#x901A;&#x5F62;&#x5F0F;&#xFF09;   
    System.out.println(&quot;&#x666E;&#x901A;&#x65B9;&#x6CD5;-&#x52A0;&#x6CD5;&#x7ED3;&#x679C;&#x662F;&#xFF1A;&quot; + calc(&quot;+&quot;, paramA, paramB));
    System.out.println(&quot;&#x666E;&#x901A;&#x65B9;&#x6CD5;-&#x51CF;&#x6CD5;&#x7ED3;&#x679C;&#x662F;&#xFF1A;&quot; + calc(&quot;-&quot;, paramA, paramB));
    //System.out.println(&quot;&#x4E58;&#x6CD5;&#x7ED3;&#x679C;&#x662F;&#xFF1A;&quot; + calc(&quot;*&quot;, paramA, paramB));
    //System.out.println(&quot;&#x9664;&#x6CD5;&#x7ED3;&#x679C;&#x662F;&#xFF1A;&quot; + calc(&quot;/&quot;, paramA, paramB));
    //&#x7B56;&#x7565;&#x6A21;&#x5F0F;
    System.out.println(&quot;&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x52A0;&#x6CD5;&#x7ED3;&#x679C;&#x662F;&#xFF1A;&quot; + calc(new AddStrategy(), paramA, paramB));
    System.out.println(&quot;&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x51CF;&#x6CD5;&#x7ED3;&#x679C;&#x662F;&#xFF1A;&quot; + calc(new SubStrategy(), paramA, paramB));
    //System.out.println(&quot;&#x4E58;&#x6CD5;&#x7ED3;&#x679C;&#x662F;&#xFF1A;&quot; + calc(new MultiStrategy(), paramA, paramB));
    //System.out.println(&quot;&#x9664;&#x6CD5;&#x7ED3;&#x679C;&#x662F;&#xFF1A;&quot; + calc(new DivStrategy(), paramA, paramB));
}

// &#x7528;if-else&#x5B9E;&#x73B0; &#xFF08; &#x666E;&#x901A;&#x5F62;&#x5F0F;&#xFF09;   
 public static double calc(String op, double paramA, double paramB){
    if (&quot;+&quot;.equals(op)) {
      return paramA + paramB;
    } else if (&quot;-&quot;.equals(op)) {
      return paramA - paramB;
    } else if (&quot;*&quot;.equals(op)) {
      return paramA * paramB;
    } else if (&quot;/&quot;.equals(op)) {
      return paramA / paramB;
    } else {
      throw new IllegalArgumentException(&quot;&#x672A;&#x627E;&#x5230;&#x8BA1;&#x7B97;&#x65B9;&#x6CD5;!&quot;);
    }
  }

//  &#x7B56;&#x7565;&#x6A21;&#x5F0F;  &#x5B9E;&#x73B0;
  public static double calc(Strategy strategy, double paramA, double paramB) {
    CalcClient calc = new CalcClient();
    calc.setStrategy(strategy);
    return calc.calc(paramA, paramB);
  }

&#x524D;&#x8005;&#x901A;&#x8FC7;&#x7B80;&#x5355;&#x7684;if-else&#x6765;&#x89E3;&#x51B3;&#x95EE;&#x9898;&#xFF0C;&#x5728;&#x89E3;&#x51B3;&#x7B80;&#x5355;&#x95EE;&#x9898;&#x4E8B;&#x4F1A;&#x66F4;&#x7B80;&#x5355;&#x3001;&#x65B9;&#x4FBF;;
&#x540E;&#x8005;&#x5219;&#x662F;&#x901A;&#x8FC7;&#x7ED9;&#x4E88;&#x4E0D;&#x540C;&#x7684;&#x5177;&#x4F53;&#x7B56;&#x7565;&#x6765;&#x83B7;&#x53D6;&#x4E0D;&#x540C;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x5BF9;&#x4E8E;&#x8F83;&#x4E3A;&#x590D;&#x6742;&#x7684;&#x4E1A;&#x52A1;&#x903B;&#x8F91;&#x663E;&#x5F97;&#x66F4;&#x4E3A;&#x76F4;&#x89C2;&#xFF0C;&#x6269;&#x5C55;&#x4E5F;&#x66F4;&#x4E3A;&#x65B9;&#x4FBF;&#x3002;
</code></pre>
<h2 id="&#x4F18;&#x7F3A;&#x70B9;_2"><a name="&#x4F18;&#x7F3A;&#x70B9;_2" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x7F3A;&#x70B9;_2"><i class="fa fa-link" aria-hidden="true"></i></a>16.2. &#x4F18;&#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">// &#x4F18;&#x70B9;
1&#x3001;&#x7ED3;&#x6784;&#x6E05;&#x6670;&#x660E;&#x4E86;&#x3001;&#x4F7F;&#x7528;&#x7B80;&#x5355;&#x76F4;&#x89C2;&#x3002;
2&#x3001;&#x8026;&#x5408;&#x5EA6;&#x76F8;&#x5BF9;&#x800C;&#x8A00;&#x8F83;&#x4F4E;&#xFF0C;&#x6269;&#x5C55;&#x65B9;&#x4FBF;&#x3002;
3&#x3001;&#x64CD;&#x4F5C;&#x5C01;&#x88C5;&#x4E5F;&#x66F4;&#x4E3A;&#x5F7B;&#x5E95;&#xFF0C;&#x6570;&#x636E;&#x66F4;&#x4E3A;&#x5B89;&#x5168;&#x3002;
// &#x7F3A;&#x70B9;
1&#x3001;&#x968F;&#x7740;&#x7B56;&#x7565;&#x7684;&#x589E;&#x52A0;&#xFF0C;&#x5B50;&#x7C7B;&#x4E5F;&#x4F1A;&#x53D8;&#x5F97;&#x7E41;&#x591A;&#x3002;
</code></pre>
<h1 id="&#x7B80;&#x5355;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;simple-factory-pattern&#xFF09;"><a name="&#x7B80;&#x5355;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;simple-factory-pattern&#xFF09;" class="anchor-navigation-ex-anchor" href="#&#x7B80;&#x5355;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;simple-factory-pattern&#xFF09;"><i class="fa fa-link" aria-hidden="true"></i></a>17. &#x7B80;&#x5355;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;Simple Factory Pattern&#xFF09;</h1>
<pre><code class="lang-text">&#x53C8;&#x53EB;&#x505A;&#x9759;&#x6001;&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#xFF08;StaticFactory Method&#xFF09;&#x6A21;&#x5F0F;&#x3002;
&#x6CE8;&#xFF1A;&#x7B80;&#x5355;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x5B9E;&#x9645;&#x4E0A;&#x4E0D;&#x5C5E;&#x4E8E;23&#x4E2A;GOF&#x6A21;&#x5F0F;&#x3002;
&#x5DE5;&#x5382;&#x7C7B;&#x6839;&#x636E;&#x4F20;&#x5165;&#x7684;&#x53C2;&#x91CF;,&#x52A8;&#x6001;&#x7684;&#x51B3;&#x5B9A;&#x5E94;&#x8BE5;&#x521B;&#x5EFA;&#x51FA;&#x54EA;&#x4E00;&#x4E2A;&#x4EA7;&#x54C1;&#x7C7B;&#x7684;&#x5B9E;&#x4F8B;&#x7684;&#x8BBE;&#x8BA1;&#x6A21;&#x5F0F;&#x3002;&#x4E00;&#x4E2A;&#x5DE5;&#x5382;&#x53EF;&#x4EE5;&#x751F;&#x4EA7;&#x591A;&#x79CD;&#x4EA7;&#x54C1;&#x3002;
</code></pre>
<h2 id="&#x4F18;&#x7F3A;&#x70B9;_3"><a name="&#x4F18;&#x7F3A;&#x70B9;_3" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x7F3A;&#x70B9;_3"><i class="fa fa-link" aria-hidden="true"></i></a>17.1. &#x4F18;&#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">//&#x4F18;&#x70B9;
&#x4F7F;&#x7528;&#x8005;&#x4E0D;&#x9700;&#x8981;&#x53BB;&#x8D1F;&#x8D23;&#x5177;&#x4F53;&#x7684;&#x521B;&#x5EFA;&#x8FC7;&#x7A0B;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5411;&#x5DE5;&#x5382;&#x4F20;&#x9012;&#x53C2;&#x6570;&#x4FE1;&#x606F;&#x5C31;&#x53EF;&#x4EE5;&#x83B7;&#x5F97;&#x81EA;&#x5DF1;&#x60F3;&#x8981;&#x7684;&#x4EA7;&#x54C1;&#x3002;
// &#x7F3A;&#x70B9;
&#x56E0;&#x4E3A;&#x5DE5;&#x5382;&#x7C7B;&#x96C6;&#x4E2D;&#x4E86;&#x6240;&#x6709;&#x5B9E;&#x4F8B;&#x7684;&#x521B;&#x5EFA;&#x903B;&#x8F91;&#xFF0C; &#x5982;&#x679C;&#x9700;&#x8981;&#x589E;&#x52A0;&#x65B0;&#x7684;&#x4EA7;&#x54C1;&#xFF0C;&#x5C31;&#x9700;&#x8981;&#x4FEE;&#x6539;&#x5DE5;&#x5382;&#x7C7B;&#xFF0C;&#x4E0D;&#x5229;&#x4E8E;&#x4EE3;&#x7801;&#x7684;&#x7EF4;&#x62A4;&#x3002;&#x8FDD;&#x80CC;&#x4E86;&#x201C;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x201D; &#x3002;&#x6240;&#x4EE5;**&#x4E0D;&#x63A8;&#x8350;**&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x8BBE;&#x8BA1;&#x6A21;&#x5F0F;&#x3002;
&#x5BA2;&#x6237;&#x5F88;&#x723D;&#xFF0C;&#x5DE5;&#x5382;&#x5F88;&#x88AB;&#x52A8;&#x3002;
</code></pre>
<h2 id="demo_4"><a name="demo_4" class="anchor-navigation-ex-anchor" href="#demo_4"><i class="fa fa-link" aria-hidden="true"></i></a>17.2. demo</h2>
<pre><code class="lang-text">// &#x4EA7;&#x54C1;&#x62BD;&#x8C61;&#x7C7B;&#xFF0C;&#x5B9A;&#x4E49;&#x4EA7;&#x54C1;&#x5171;&#x540C;&#x7684;&#x7279;&#x6548; 
public interface Product{
    public void getProductInfo() ;
}
// &#x5177;&#x4F53;&#x7684;&#x4EA7;&#x54C1;
public class Car implements Product{
    @Override
    public void getProductInfo(){
        System.out.println(&quot;&#x6C7D;&#x8F66;&#x4EA7;&#x54C1;&quot;);
    }//
}//

public class Bicycle implements Product{
    @Override
    public void getProductInfo(){
        System.out.println(&quot;&#x81EA;&#x884C;&#x8F66;&#x4EA7;&#x54C1;&quot;);
    }//
}//

// &#x7B80;&#x5355;&#x5DE5;&#x5382;
public class SimpleFactory{
    /**
     * &#x6839;&#x636E;&#x4E0D;&#x540C;&#x7684;&#x53C2;&#x6570;&#x8FDB;&#x884C;&#x5224;&#x65AD;&#xFF0C;&#x8FD4;&#x56DE;&#x4E0D;&#x540C;&#x7684;&#x7ED3;&#x679C;&#x3002;
     * &#x5982;&#x679C;&#x589E;&#x52A0;&#x4E86;&#x4EA7;&#x54C1;&#x7C7B;&#xFF0C;&#x9700;&#x8981;&#x4FEE;&#x6539;&#x5224;&#x65AD;&#x4EE3;&#x7801;&#x3002;
     * &#x9759;&#x6001;&#x5DE5;&#x5382;&#x65B9;&#x6CD5; &#x7684;&#x201C;&#x9759;&#x6001;&#x201D;&#x4F53;&#x73B0;&#x5728;&#x8FD9;&#x4E2A; static&#x65B9;&#x6CD5;&#x4E0A;
     */
    public static Product getProductInfo(String productType ){
        Product product = null ;
        if(&quot;car&quot;.equals(productType)){
            product = new Car() ;
        }else{
            product = new Bicycle() ;
        }
        return product;
    }//
}
 // &#x6D4B;&#x8BD5;
public static void main(String[] args){
  //&#x76F4;&#x63A5;&#x8C03;&#x7528;&#x5DE5;&#x5382;&#x7C7B;&#x7684; &#x9759;&#x6001;&#x65B9;&#x6CD5;&#x6216;&#x7684;&#x4EA7;&#x54C1;&#x3002;
  Product product =SimpleFactory.getProductInfo(&quot;car&quot;) ;
  product.getProductInfo() ;
}//
</code></pre>
<h1 id="&#x62BD;&#x8C61;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;abstract-factory-pattern&#xFF09;"><a name="&#x62BD;&#x8C61;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;abstract-factory-pattern&#xFF09;" class="anchor-navigation-ex-anchor" href="#&#x62BD;&#x8C61;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;abstract-factory-pattern&#xFF09;"><i class="fa fa-link" aria-hidden="true"></i></a>18. &#x62BD;&#x8C61;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#xFF08;Abstract Factory Pattern&#xFF09;</h1>
<pre><code class="lang-text">&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;&#x662F;&#x4E00;&#x4E2A;&#x5177;&#x4F53;&#x5DE5;&#x5382;&#x751F;&#x4EA7;&#x4E00;&#x79CD;&#x5177;&#x4F53;&#x4EA7;&#x54C1;&#xFF0C;&#x62BD;&#x8C61;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x662F;&#x4E00;&#x4E2A;&#x5177;&#x4F53;&#x5DE5;&#x5382;&#x751F;&#x4EA7;&#x4E00;&#x4E2A;&#x54C1;&#x724C;&#x4E0B;&#x7684;&#x591A;&#x79CD;&#x4EA7;&#x54C1;&#x3002;
&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;&#x89E3;&#x51B3;&#x4E86;&#x7B80;&#x5355;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x4E2D;&#x5DE5;&#x5382;&#x7C7B;&#x804C;&#x8D23;&#x592A;&#x91CD;&#x7684;&#x95EE;&#x9898;&#x3002;
&#x4F46;&#x7531;&#x4E8E;&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;&#x4E2D;&#x7684;&#x6BCF;&#x4E2A;&#x5DE5;&#x5382;&#x53EA;&#x751F;&#x4EA7;&#x4E00;&#x7C7B;&#x4EA7;&#x54C1;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x5BFC;&#x81F4;&#x7CFB;&#x7EDF;&#x4E2D;&#x5B58;&#x5728;&#x5927;&#x91CF;&#x7684;&#x5DE5;&#x5382;&#x7C7B;&#xFF0C;&#x52BF;&#x5FC5;&#x4F1A;&#x589E;&#x52A0;&#x7CFB;&#x7EDF;&#x7684;&#x5F00;&#x9500;&#x3002;
&#x6B64;&#x65F6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x5C06;&#x4E00;&#x4E9B;&#x76F8;&#x5173;&#x7684;&#x4EA7;&#x54C1;&#x7EC4;&#x6210;&#x4E00;&#x4E2A;&#x201C;&#x4EA7;&#x54C1;&#x65CF;&#x201D;&#xFF0C;&#x7531;&#x540C;&#x4E00;&#x4E2A;&#x5DE5;&#x5382;&#x6765;&#x7EDF;&#x4E00;&#x751F;&#x4EA7;&#xFF0C;&#x8FD9;&#x5C31;&#x662F;&#x62BD;&#x8C61;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x7684;&#x57FA;&#x672C;&#x601D;&#x60F3;&#x3002;
</code></pre>
<h2 id="&#x4EA7;&#x54C1;&#x7B49;&#x7EA7;&#x7ED3;&#x6784;-&#x3001;&#x4EA7;&#x54C1;&#x65CF;"><a name="&#x4EA7;&#x54C1;&#x7B49;&#x7EA7;&#x7ED3;&#x6784;-&#x3001;&#x4EA7;&#x54C1;&#x65CF;" class="anchor-navigation-ex-anchor" href="#&#x4EA7;&#x54C1;&#x7B49;&#x7EA7;&#x7ED3;&#x6784;-&#x3001;&#x4EA7;&#x54C1;&#x65CF;"><i class="fa fa-link" aria-hidden="true"></i></a>18.1. &#x4EA7;&#x54C1;&#x7B49;&#x7EA7;&#x7ED3;&#x6784; &#x3001;&#x4EA7;&#x54C1;&#x65CF;</h2>
<pre><code class="lang-text">// &#x4EA7;&#x54C1;&#x7B49;&#x7EA7;&#x7ED3;&#x6784;
&#x7C7B;&#x4F3C;&#x624B;&#x673A;&#x4E0E;androdi&#x624B;&#x673A;&#x3001;mac&#x624B;&#x673A;&#x7684;&#x5173;&#x7CFB;&#x3002;&#x624B;&#x673A;&#x548C;Android&#x624B;&#x673A;&#x3001;mac&#x624B;&#x673A;&#x5177;&#x4F53;&#x624B;&#x673A;&#x4EA7;&#x54C1;&#x4E4B;&#x95F4;&#x6784;&#x6210;&#x4E86;&#x4E00;&#x4E2A;&#x4EA7;&#x54C1;&#x7B49;&#x7EA7;&#x7ED3;&#x6784;&#x3002;
// &#x4EA7;&#x54C1;&#x65CF;
&#x540C;&#x4E00;&#x4E2A;&#x54C1;&#x724C;&#x4E0B;&#x7684;&#x5404;&#x79CD;&#x4EA7;&#x54C1;&#xFF0C;&#x6BD4;&#x5982;android&#x624B;&#x673A;&#x548C;Android&#x7535;&#x89C6;&#x5C5E;&#x4E8E;&#x540C;&#x4E00;&#x4E2A;&#x4EA7;&#x54C1;&#x65CF;&#x3002;
</code></pre>
<h2 id="&#x4F18;&#x7F3A;&#x70B9;_4"><a name="&#x4F18;&#x7F3A;&#x70B9;_4" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x7F3A;&#x70B9;_4"><i class="fa fa-link" aria-hidden="true"></i></a>18.2. &#x4F18;&#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">// &#x4F18;&#x70B9;
- 1&#x3001;&#x9694;&#x79BB;&#x4E86;&#x5177;&#x4F53;&#x7C7B;&#x7684;&#x751F;&#x6210;&#xFF0C;&#x66F4;&#x6362;&#x4E00;&#x4E2A;&#x5177;&#x4F53;&#x5DE5;&#x5382;&#x5C31;&#x53D8;&#x5F97;&#x76F8;&#x5BF9;&#x5BB9;&#x6613;&#x3002;
- 2&#x3001;&#x589E;&#x52A0;&#x65B0;&#x7684;&#x4EA7;&#x54C1;&#x65CF;&#x5F88;&#x65B9;&#x4FBF;&#xFF0C;&#x65E0;&#x987B;&#x4FEE;&#x6539;&#x5DF2;&#x6709;&#x7CFB;&#x7EDF;&#xFF0C;&#x7B26;&#x5408;&#x201C;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x201D;&#x3002;
//&#x7F3A;&#x70B9;
- 1&#x3001;&#x589E;&#x52A0;&#x65B0;&#x7684;&#x4EA7;&#x54C1;&#x7B49;&#x7EA7;&#x7ED3;&#x6784;&#x9EBB;&#x70E6;&#xFF0C;&#x8FDD;&#x80CC;&#x4E86;&#x201C;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x201D;&#x3002;
&#x589E;&#x52A0;&#x65B0;&#x7684;&#x4EA7;&#x54C1;&#x65CF;&#x5F88;&#x65B9;&#x4FBF;&#xFF0C;&#x4F46;&#x662F;&#x589E;&#x52A0;&#x65B0;&#x7684;&#x4EA7;&#x54C1;&#x7B49;&#x7EA7;&#x7ED3;&#x6784;&#x5F88;&#x9EBB;&#x70E6;&#xFF0C;&#x62BD;&#x8C61;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x7684;&#x8FD9;&#x79CD;&#x6027;&#x8D28;&#x79F0;&#x4E3A;&#x201C;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x201D;&#x7684;&#x503E;&#x659C;&#x6027;&#x3002;
</code></pre>
<h2 id="demo_5"><a name="demo_5" class="anchor-navigation-ex-anchor" href="#demo_5"><i class="fa fa-link" aria-hidden="true"></i></a>18.3. demo</h2>
<pre><code class="lang-text">// &#x62BD;&#x8C61;&#x4EA7;&#x54C1;
public interface Iphone{
    public void getInfo();
}
// &#x62BD;&#x8C61;&#x4EA7;&#x54C1;
public interface TV{
    public void getInfo();
}
// &#x5177;&#x4F53;&#x4EA7;&#x54C1;
public class AndroidIphone implements Iphone{
    @Override
    public void getInfo(){
        System.out.println(&quot;mac &#x624B;&#x673A;&quot;);
    }
}
public class MacIphone implements Iphone{
    @Override
    public void getInfo(){
        System.out.println(&quot;android &#x624B;&#x673A;&quot;);
    }
}
public class AndroidTv implements TV{
    @Override
    public void getInfo(){
        System.out.println(&quot; Android &#x7535;&#x89C6;&quot;);
    }
}
public class MACTv implements TV{
    @Override
    public void getInfo() {
        System.out.println(&quot; MAC &#x7535;&#x89C6;&quot;);
    }
}

// &#x62BD;&#x8C61;&#x5DE5;&#x5382;
public interface IFactory{
  public Iphone createPhone() ;
  public TV createTV() ;
}
// &#x5177;&#x4F53;&#x5DE5;&#x5382;&#x3002;
public class AndroidFactory implements IFactory{
    @Override
    public Iphone createPhone(){
        return new MacIphone();
    }

    @Override
    public TV createTV(){
        return new MACTv();
    }
}
// &#x5177;&#x4F53;&#x5DE5;&#x5382;
public class MacFactory implements IFactory{
    @Override
    public Iphone createPhone(){
        return new AndroidIphone();
    }
    @Override
    public TV createTV(){
        return new AndroidTv();
    }
}

// &#x6D4B;&#x8BD5;&#x573A;&#x666F; 
public static void main(String[] args){
  IFactory factory = new AndroidFactory() ;
  //&#x6839;&#x636E;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x6216;&#x8005;&#x7F51;&#x7EDC;&#x53C2;&#x6570;&#xFF0C;&#x52A8;&#x6001;&#x51B3;&#x5B9A;&#x91C7;&#x7528;&#x54EA;&#x4E00;&#x4E2A;&#x5DE5;&#x5382;&#x3002;
  //IFactory factory = new MacFactory() ;
  //&#x6279;&#x91CF;&#x5F97;&#x5230;&#x5C5E;&#x4E8E;&#x540C;&#x4E00;&#x54C1;&#x724C;&#x4E0B;&#x7684;&#x4EA7;&#x54C1;&#x3002;
  Iphone phone = factory.createPhone() ;
  TV tv = factory.createTV() ;
  tv.getInfo();
}//
</code></pre>
<h1 id="&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;&#xFF08;factory-method-pattern&#xFF09;"><a name="&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;&#xFF08;factory-method-pattern&#xFF09;" class="anchor-navigation-ex-anchor" href="#&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;&#xFF08;factory-method-pattern&#xFF09;"><i class="fa fa-link" aria-hidden="true"></i></a>19. &#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;&#xFF08;Factory Method Pattern&#xFF09;</h1>
<pre><code class="lang-text">&#x53C8;&#x88AB;&#x79F0;&#x4E3A;&#x591A;&#x6001;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x3002;
&#x901A;&#x5E38;&#x6211;&#x4EEC;&#x6240;&#x8BF4;&#x7684;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x662F;&#x6307;&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x6A21;&#x5F0F;&#x3002;
&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x662F;&#x9488;&#x5BF9;&#x6BCF;&#x4E00;&#x79CD;&#x4EA7;&#x54C1;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x5DE5;&#x5382;&#x7C7B;&#x3002;&#x901A;&#x8FC7;&#x4E0D;&#x540C;&#x7684;&#x5DE5;&#x5382;&#x5B9E;&#x4F8B;&#x6765;&#x521B;&#x5EFA;&#x4E0D;&#x540C;&#x7684;&#x4EA7;&#x54C1;&#x5B9E;&#x4F8B;&#x3002;
&#x53CD;&#x5C04;&#x751F;&#x6210;&#x5BF9;&#x8C61;&#x53EA;&#x80FD;&#x9002;&#x7528;&#x4E00;&#x4E9B;&#x6700;&#x7B80;&#x5355;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x7B80;&#x5355;&#x7684;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x3002;
&#x5982;&#x679C;&#x5BF9;&#x8C61;&#x7684;&#x521B;&#x5EFA;&#x8FC7;&#x7A0B;&#x6BD4;&#x8F83;&#x590D;&#x6742;&#xFF0C;&#x4F8B;&#x5982;&#x8981;&#x8C03;&#x7528;&#x6709;&#x53C2;&#x6784;&#x9020;&#x51FD;&#x6570;&#x3001;&#x521B;&#x5EFA;&#x4E4B;&#x524D;&#x8981;&#x914D;&#x7F6E;&#x73AF;&#x5883;&#x7B49;&#x7B49;&#xFF0C;&#x9700;&#x8981;&#x5C06;&#x8FD9;&#x4E9B;&#x4EE3;&#x7801;&#x5C01;&#x88C5;&#x5230;&#x5DE5;&#x5382;&#x4E2D;&#x3002;

// &#x5B9A;&#x4E49;&#x5DE5;&#x5382;&#x7684;&#x516C;&#x5171;&#x884C;&#x4E3A;&#x3002; &#x53EF;&#x4EE5;&#x7528;&#x63A5;&#x53E3;&#x6216;&#x62BD;&#x8C61;&#x7C7B;&#x3002;
public interface  Factory{
    public Product produceProduct() ;
}
// &#x5177;&#x4F53;&#x7684;&#x4EA7;&#x54C1; car
public class Car implements Product{
    @Override
    public void getProductInfo(){
        System.out.println(&quot;&#x6C7D;&#x8F66;&#x4EA7;&#x54C1;&quot;);
    }
}
// &#x5177;&#x4F53;&#x7684;&#x4EA7;&#x54C1;  bicycle
public class Bicycle implements Product{
    @Override
    public void getProductInfo(){
        System.out.println(&quot;&#x81EA;&#x884C;&#x8F66;&#x4EA7;&#x54C1;&quot;);
    }
}

// &#x5B9A;&#x4E49;&#x5DE5;&#x5382;&#x7684;&#x516C;&#x5171;&#x884C;&#x4E3A;&#x3002;&#x53EF;&#x4EE5;&#x7528;&#x63A5;&#x53E3;&#x6216;&#x62BD;&#x8C61;&#x7C7B;&#x3002;
public interface  Factory{
    public Product produceProduct() ;
}

// &#x5177;&#x4F53;&#x7684;&#x5DE5;&#x5382;&#x7C7B;&#x3002;BicycleFactory
public class BicycleFactory implements Factory{
    @Override
    public Product produceProduct(){
        //&#x505A;&#x4E00;&#x4E9B;&#x590D;&#x6742;&#x7684;&#x64CD;&#x4F5C;&#x3002;&#x6BD4;&#x5982;&#x8FDE;&#x63A5;&#x6570;&#x636E;&#x5E93;&#x7B49;
        //&#x8C03;&#x7528;&#x6709;&#x53C2;&#x6784;&#x9020;&#x7B49;
        Bicycle bicycle = new Bicycle();
        return bicycle;
    }
}//

// &#x5177;&#x4F53;&#x7684;&#x5DE5;&#x5382;&#x7C7B;&#x3002;CarFactory
public class CarFactory implements Factory{
    @Override
    public Product produceProduct(){
        //&#x505A;&#x4E00;&#x4E9B;&#x590D;&#x6742;&#x7684;&#x64CD;&#x4F5C;&#x3002;&#x6BD4;&#x5982;&#x8FDE;&#x63A5;&#x6570;&#x636E;&#x5E93;&#x7B49;
        // ...
        //&#x8C03;&#x7528;&#x6709;&#x53C2;&#x6784;&#x9020;&#x7B49;
        Car car = new Car();
        return car;
    }
}//

 /**&#x4F7F;&#x7528;&#x573A;&#x666F;*/
 public static void main(String[] args){
   //&#x6839;&#x636E;&#x76F8;&#x5173;&#x53C2;&#x6570; &#x751F;&#x6210;&#x5177;&#x4F53;&#x7684;&#x5DE5;&#x5382;&#x5BF9;&#x8C61;&#x3002;&#x4F8B;&#x5982;&#x6839;&#x636E;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x6216;&#x8005;&#x7F51;&#x7EDC;&#x53C2;&#x6570;&#x6765;&#x51B3;&#x5B9A;
    Factory factory ;
    factory= new CarFactory() ;
    //factory= new BicycleFactory() ;

    Product product = factory.produceProduct() ;
    product.getProductInfo();
 }//
</code></pre>
<h2 id="&#x4F18;&#x7F3A;&#x70B9;_5"><a name="&#x4F18;&#x7F3A;&#x70B9;_5" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x7F3A;&#x70B9;_5"><i class="fa fa-link" aria-hidden="true"></i></a>19.1. &#x4F18;&#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">// &#x4F18;&#x70B9;
1&#x3001;&#x5B83;&#x80FD;&#x591F;&#x8BA9;&#x5DE5;&#x5382;&#x53EF;&#x4EE5;&#x81EA;&#x4E3B;&#x786E;&#x5B9A;&#x521B;&#x5EFA;&#x4F55;&#x79CD;&#x4EA7;&#x54C1;&#x5BF9;&#x8C61;&#xFF0C;&#x800C;&#x5982;&#x4F55;&#x521B;&#x5EFA;&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;&#x7EC6;&#x8282;&#x5219;&#x5B8C;&#x5168;&#x5C01;&#x88C5;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x5177;&#x4F53;&#x5DE5;&#x5382;&#x5185;&#x90E8;&#x3002;
2&#x3001;&#x52A0;&#x5165;&#x65B0;&#x4EA7;&#x54C1;&#x65F6;&#xFF0C;&#x65E0;&#x987B;&#x4FEE;&#x6539;&#x62BD;&#x8C61;&#x5DE5;&#x5382;&#x548C;&#x62BD;&#x8C61;&#x4EA7;&#x54C1;&#x63D0;&#x4F9B;&#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x4E5F;&#x65E0;&#x987B;&#x4FEE;&#x6539;&#x5176;&#x4ED6;&#x7684;&#x5177;&#x4F53;&#x5DE5;&#x5382;&#x548C;&#x5177;&#x4F53;&#x4EA7;&#x54C1;&#xFF0C;
&#x800C;&#x53EA;&#x8981;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x5177;&#x4F53;&#x5DE5;&#x5382;&#x548C;&#x5177;&#x4F53;&#x4EA7;&#x54C1;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#x3002;

// &#x7F3A;&#x70B9;
1&#x3001;&#x5728;&#x6DFB;&#x52A0;&#x65B0;&#x4EA7;&#x54C1;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x65B0;&#x52A0;&#x65B0;&#x7684;&#x5177;&#x4F53;&#x4EA7;&#x54C1;&#x7C7B;&#x548C;&#x4E0E;&#x4E4B;&#x5BF9;&#x5E94;&#x7684;&#x5177;&#x4F53;&#x5DE5;&#x5382;&#x7C7B;&#xFF0C;&#x5728;&#x4E00;&#x5B9A;&#x7A0B;&#x5EA6;&#x4E0A;&#x589E;&#x52A0;&#x4E86;&#x7CFB;&#x7EDF;&#x7684;&#x590D;&#x6742;&#x5EA6;&#xFF0C;
&#x6709;&#x66F4;&#x591A;&#x7684;&#x7C7B;&#x9700;&#x8981;&#x7F16;&#x8BD1;&#x548C;&#x8FD0;&#x884C;&#xFF0C;&#x4F1A;&#x7ED9;&#x7CFB;&#x7EDF;&#x5E26;&#x6765;&#x4E00;&#x4E9B;&#x989D;&#x5916;&#x7684;&#x5F00;&#x9500;&#x3002;
</code></pre>
<h2 id="&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x548C;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;"><a name="&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x548C;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x548C;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>19.2. &#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x548C;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;</h2>
<pre><code class="lang-text">1&#x3001;&#x4FA7;&#x91CD;&#x70B9;&#x4E0D;&#x4E00;&#x6837; &#x3002; &#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x4FA7;&#x91CD;&#x6784;&#x5EFA;&#x8FC7;&#x7A0B;&#xFF0C;&#x4F7F;&#x7528;&#x8005;&#x62FF;&#x5230;&#x6700;&#x7EC8;&#x7684;&#x201C;&#x751F;&#x4EA7;&#x7269;&#x201D;&#x5373;&#x53EF;&#x3002; 
&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x4FA7;&#x91CD; &#x4E8B;&#x4EF6;&#x7684;&#x884C;&#x4E3A;&#xFF0C;&#x4F7F;&#x7528;&#x53EF;&#x4E92;&#x6362;&#x7684;&#x89C4;&#x5219;&#x521B;&#x5EFA;&#x6210;&#x529F;&#x4E1A;&#x52A1;&#x3002;  
&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x662F;&#x5F00;&#x653E;&#x7684;&#xFF0C;&#x5927;&#x591A;&#x6570;&#x4E8B;&#x60C5;&#x8981;&#x4F60;&#x81EA;&#x5DF1;&#x4EB2;&#x529B;&#x4EB2;&#x4E3A;&#x3002;
&#x800C;&#x5DE5;&#x5382;&#x6A21;&#x5F0F;&#x4F5C;&#x662F;&#x5C01;&#x95ED;&#x7684;&#xFF0C;&#x5F88;&#x591A;&#x4E8B;&#x60C5;&#x90FD;&#x5E2E;&#x7EC4;&#x4F60;&#x505A;&#x597D;&#x4E86;&#xFF0C;&#x4F60;&#x76F4;&#x63A5;&#x201C;&#x70B9;&#x201D;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#x3002; 
&#x5DE5;&#x5382;&#x76F8;&#x5F53;&#x4E8E;&#x9ED1;&#x76D2;&#x5B50;&#xFF0C;&#x7B56;&#x7565;&#x76F8;&#x5F53;&#x4E8E;&#x767D;&#x76D2;&#x5B50;?  [&#x53C2;&#x8003;&#x8D44;&#x6599;](http://blog.csdn.net/tengzhaorong/article/details/6827093)
</code></pre>
<h1 id="&#x7EC4;&#x5408;&#x6A21;&#x5F0F;-composite-pattern-&#x3001;-&#x6574;&#x4F53;-&#x90E8;&#x5206;&#x6A21;&#x5F0F;"><a name="&#x7EC4;&#x5408;&#x6A21;&#x5F0F;-composite-pattern-&#x3001;-&#x6574;&#x4F53;-&#x90E8;&#x5206;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x7EC4;&#x5408;&#x6A21;&#x5F0F;-composite-pattern-&#x3001;-&#x6574;&#x4F53;-&#x90E8;&#x5206;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>20. &#x7EC4;&#x5408;&#x6A21;&#x5F0F; Composite Pattern &#x3001; &#x6574;&#x4F53;-&#x90E8;&#x5206;&#x6A21;&#x5F0F;</h1>
<pre><code class="lang-text">&#x7EC4;&#x5408;&#x6A21;&#x5F0F;&#x5C06;&#x4E00;&#x6279;&#x6709;&#x5171;&#x540C;&#x7279;&#x5F81;&#x7684;&#x5BF9;&#x8C61;&#x7EC4;&#x5408;&#x6210; &#x201C;&#x6811;&#x5F62;&#x7ED3;&#x6784;&#x201D;&#x3002;
&#x5173;&#x952E;&#x70B9;&#x662F;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x6784;&#x4EF6;&#x7C7B;&#xFF0C;&#x5B83;&#x65E2;&#x53EF;&#x4EE5;&#x4EE3;&#x8868;&#x53F6;&#x5B50;&#xFF0C;&#x53C8;&#x53EF;&#x4EE5;&#x4EE3;&#x8868;&#x5BB9;&#x5668;&#xFF0C;
&#x800C;&#x5BA2;&#x6237;&#x7AEF;&#x9488;&#x5BF9;&#x8BE5;&#x62BD;&#x8C61;&#x6784;&#x4EF6;&#x7C7B;&#x8FDB;&#x884C;&#x7F16;&#x7A0B;&#xFF0C;&#x65E0;&#x987B;&#x77E5;&#x9053;&#x5B83;&#x5230;&#x5E95;&#x8868;&#x793A;&#x7684;&#x662F;&#x53F6;&#x5B50;&#x8FD8;&#x662F;&#x5BB9;&#x5668;&#xFF0C;&#x53EF;&#x4EE5;&#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x7EDF;&#x4E00;&#x5904;&#x7406;&#x3002;
</code></pre>
<h2 id="&#x900F;&#x660E;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;-&#xFF08;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#xFF09;"><a name="&#x900F;&#x660E;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;-&#xFF08;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#xFF09;" class="anchor-navigation-ex-anchor" href="#&#x900F;&#x660E;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;-&#xFF08;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#xFF09;"><i class="fa fa-link" aria-hidden="true"></i></a>20.1. &#x900F;&#x660E;&#x7EC4;&#x5408;&#x6A21;&#x5F0F; &#xFF08;&#x63A8;&#x8350;&#x4F7F;&#x7528;&#xFF09;</h2>
<pre><code class="lang-text">&#x5F3A;&#x8C03;&#x900F;&#x660E;&#x6027;&#x4E00;&#x81F4;&#x6027;&#x3002; 
&#x56E0;&#x4E3A;&#x53F6;&#x5B50;&#x8282;&#x70B9;&#x4E0D;&#x5B58;&#x5728;&#x5B50;&#x8282;&#x70B9;&#xFF0C;&#x6240;&#x4EE5;&#x4E00;&#x4E9B;&#x65B9;&#x6CD5;&#x662F;&#x65E0;&#x6548;&#x7684;&#x3002;&#x53EF;&#x4EE5;&#x7528;&#x8FC7; &#x201C;&#x63D0;&#x4F9B;&#x5F02;&#x5E38;&#x5904;&#x7406;&#x6216;&#x76F8;&#x5173;&#x63D0;&#x793A;&#x201D;&#x6765;&#x89E3;&#x51B3; &#x3002;
</code></pre>
<p><img src="https://gitee.com/hnyer/filesOfGitbook/raw/master/files/201804091146_osChina_&#x900F;&#x660E;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;.png" alt=""></p>
<h2 id="&#x5B89;&#x5168;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;"><a name="&#x5B89;&#x5168;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x5B89;&#x5168;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>20.2. &#x5B89;&#x5168;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;</h2>
<p><img src="https://gitee.com/hnyer/filesOfGitbook/raw/master/files/201804091147_osChina_&#x5B89;&#x5168;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;.png" alt=""></p>
<h2 id="&#x4F18;&#x70B9;"><a name="&#x4F18;&#x70B9;" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x70B9;"><i class="fa fa-link" aria-hidden="true"></i></a>20.3. &#x4F18;&#x70B9;</h2>
<pre><code class="lang-text">1&#x3001;&#x5C06;&#x5BF9;&#x8C61;&#x4EEC;&#x8FDB;&#x884C;&#x6811;&#x5F62;&#x5206;&#x5C42;&#xFF0C;&#x65B9;&#x4FBF;&#x5BF9;&#x6574;&#x4E2A;&#x67D0;&#x4E2A;&#x5C42;&#x6B21;&#x7684;&#x6240;&#x6709;&#x5BF9;&#x8C61;&#x8FDB;&#x884C;&#x5904;&#x7406;&#x3002;
2&#x3001;&#x4F7F;&#x7528;&#x900F;&#x660E;&#x7EC4;&#x5408;&#x6A21;&#x5F0F;&#x65F6;&#xFF0C; &#x65B0;&#x589E;&#x8282;&#x70B9;(&#x5BB9;&#x5668;&#x8282;&#x70B9;&#x3001;&#x5B50;&#x8282;&#x70B9;) &#x7B26;&#x5408; &#x201C;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x201D; &#x3002;
</code></pre>
<h2 id="demo_6"><a name="demo_6" class="anchor-navigation-ex-anchor" href="#demo_6"><i class="fa fa-link" aria-hidden="true"></i></a>20.4. demo</h2>
<pre><code class="lang-text">/**&#x62BD;&#x8C61;&#x8282;&#x70B9;  */
abstract class AbstractFile{  
    public abstract void add(AbstractFile file);  
    public abstract AbstractFile getChild(int i);  
    public abstract void killVirus();  
}

/**&#x53F6;&#x5B50;&#x8282;&#x70B9;*/
class ImageFile extends AbstractFile{  
    private String name;  
    public ImageFile(String name) { ...}  
    public void add(AbstractFile file) {  
       // &#x5B50;&#x8282;&#x70B9; &#x4E0D;&#x652F;&#x6301; &#x5F53;&#x524D;&#x65B9;&#x6CD5; &#x7684;&#x76F8;&#x5173;&#x63D0;&#x793A;
    }  
    public AbstractFile getChild(int i)  {  
        // &#x5B50;&#x8282;&#x70B9; &#x4E0D;&#x652F;&#x6301; &#x5F53;&#x524D;&#x65B9;&#x6CD5; &#x7684;&#x76F8;&#x5173;&#x63D0;&#x793A;
        return null;  
    }  
    public void killVirus()  {  
        //&#x6A21;&#x62DF;&#x6740;&#x6BD2;  
        ...
    }  
}  

/**&#x5BB9;&#x5668;&#x8282;&#x70B9;*/
class Folder extends AbstractFile {  
    private ArrayList&lt;AbstractFile&gt; fileList=new ArrayList&lt;&gt;();  
    private String name;  
    public Folder(String name) {...}  
    public void add(AbstractFile file) {  
       fileList.add(file);    
    }  
    public AbstractFile getChild(int i) {  
        return (AbstractFile)fileList.get(i);  
    }  
    public void killVirus()  {  
        //&#x9012;&#x5F52;&#x8C03;&#x7528;
        for(AbstractFile obj : fileList)  {  
            obj .killVirus();  
        }  
    }  
}

//&#x4F7F;&#x7528; &#x3002;&#x9488;&#x5BF9;&#x62BD;&#x8C61;&#x6784;&#x4EF6;&#x7F16;&#x7A0B;
// &#x5B50;&#x8282;&#x70B9;
AbstractFile folder2 = new Folder(&quot;&#x56FE;&#x50CF;&#x6587;&#x4EF6;&#x5939;&quot;);  
folder2.add(new ImageFile(&quot;xxx.jpg&quot;));  
folder2.add(new ImageFile(&quot;xxxx.gif&quot;));  
// &#x5BB9;&#x5668;&#x8282;&#x70B9;
AbstractFile file1 = new Folder();
folder1.add(folder2);  
folder1.killVirus();
</code></pre>
<h1 id="&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F;-&#x3001;decorator-pattern-&#x3001;&#x5305;&#x88C5;&#x6A21;&#x5F0F;--&#x3001;wrapper-pattern"><a name="&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F;-&#x3001;decorator-pattern-&#x3001;&#x5305;&#x88C5;&#x6A21;&#x5F0F;--&#x3001;wrapper-pattern" class="anchor-navigation-ex-anchor" href="#&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F;-&#x3001;decorator-pattern-&#x3001;&#x5305;&#x88C5;&#x6A21;&#x5F0F;--&#x3001;wrapper-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>21. &#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F; &#x3001;Decorator Pattern &#x3001;&#x5305;&#x88C5;&#x6A21;&#x5F0F;  &#x3001;Wrapper Pattern</h1>
<pre><code class="lang-text">&#x88C5;&#x9970;&#x6A21;&#x5F0F;&#x662F;&#x4E00;&#x79CD;&#x7528;&#x4E8E;&#x66FF;&#x4EE3;&#x7EE7;&#x627F;&#x7684;&#x6280;&#x672F;&#x3002;
&#x5728;&#x4E0D;&#x6539;&#x53D8;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x539F;&#x6709;&#x7ED3;&#x6784;&#x548C;&#x529F;&#x80FD;&#x7684;&#x524D;&#x63D0;&#x4E0B;&#xFF0C;&#x7ED9;&#x5B83;&#x65B0;&#x52A0;&#x4E00;&#x4E9B;&#x989D;&#x5916;&#x7684;&#x529F;&#x80FD;&#x3002; 

public class ConcreteComponent extends MyComponent{
    /**&#x539F;&#x6709;&#x529F;&#x80FD;*/
    @Override
    public void operation() { ...  }
}
</code></pre>
<h2 id="&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;-&#x5C3D;&#x91CF;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;"><a name="&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;-&#x5C3D;&#x91CF;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;-&#x5C3D;&#x91CF;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>21.1. &#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F; (&#x5C3D;&#x91CF;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;)</h2>
<pre><code class="lang-text">&#x8981;&#x6C42;&#x5B8C;&#x5168;&#x9488;&#x5BF9;&#x62BD;&#x8C61;&#x7F16;&#x7A0B;&#x3002;&#x53EF;&#x4EE5;&#x900F;&#x660E;&#x5730;&#x4F7F;&#x7528;&#x88C5;&#x9970;&#x4E4B;&#x524D;&#x7684;&#x5BF9;&#x8C61;&#x548C;&#x88C5;&#x9970;&#x4E4B;&#x540E;&#x7684;&#x5BF9;&#x8C61;&#x3002;
&#x4E3A;&#x4E86;&#x8FBE;&#x5230;&#x8FD9;&#x79CD;&#x6548;&#x679C;&#xFF0C; &#x5FC5;&#x987B;&#x5728;&#x6784;&#x4EF6;&#x5BF9;&#x8C61;&#x7684;&#x65B9;&#x6CD5;&#x4E2D;&#x8C03;&#x7528; &#x589E;&#x5F3A;&#x65B9;&#x6CD5;&#x3002;
&#x4F46;&#x662F;&#x7F3A;&#x70B9;&#x662F;&#x7528;&#x6237;&#x4E0D;&#x80FD;&#x5355;&#x72EC;&#x5730;&#x8C03;&#x7528;&#x90A3;&#x4E9B;&#x589E;&#x5F3A;&#x7684;&#x65B9;&#x6CD5; &#x3002;

/**&#x5177;&#x4F53;&#x88C5;&#x9970;&#x5668;*/
public class ConcreteDecoratorA  extends MyComponent{
    MyComponent component ;
    /**&#x6301;&#x6709;&#x88AB;&#x88C5;&#x9970;&#x7684;&#x5BF9;&#x8C61;*/
    public ConcreteDecoratorA(MyComponent component) { ...  }
    public int operationA(){ ... &#x589E;&#x5F3A;&#x65B9;&#x6CD5; ...  }

    @Override
    public void operation() {
        // &#x533A;&#x522B;&#x70B9;&#xFF01;&#xFF01;&#x91CC;&#x9762;&#x8C03;&#x7528;&#x4E86; operationA&#xFF08;&#xFF09;
        operationA();
        component.operation();
    }
}

MyComponent myComponet1= new ConcreteComponent(...);
// &#x9488;&#x5BF9;MyComponent&#x62BD;&#x8C61;&#x7F16;&#x7A0B;
MyComponent myComponet2 = new ConcreteDecoratorA(myComponet1);
myComponet1.operation();
//&#x4E0D;&#x80FD;&#x5728;&#x5916;&#x9762;&#x8C03;&#x7528;&#x989D;&#x5916;&#x529F;&#x80FD; &#x3002;- &#x7F16;&#x8BD1; &#x51FA;&#x9519;
myComponet2.operationA();
myComponet2.operation();
</code></pre>
<h2 id="&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;"><a name="&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>21.2. &#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;</h2>
<pre><code class="lang-text">/**&#x5177;&#x4F53;&#x88C5;&#x9970;&#x5668;*/
public class ConcreteDecoratorA  extends MyComponent {
    MyComponent component ;
    /**&#x6301;&#x6709;&#x88AB;&#x88C5;&#x9970;&#x7684;&#x5BF9;&#x8C61;*/
    public ConcreteDecoratorA(MyComponent component) { ...  }
    public int operationA(){ ... &#x589E;&#x5F3A;&#x65B9;&#x6CD5; ...  }

    @Override
    public void operation()  {
        // &#x533A;&#x522B;&#x70B9;&#xFF01;&#xFF01; &#x5728;&#x91CC;&#x9762;&#x5E76;&#x6CA1;&#x6709;&#x8C03;&#x7528; operationA()
        component.operation();
    }
}

MyComponent myComponet1= new ConcreteComponent(...);
ConcreteDecoratorA myComponet2 = new ConcreteDecoratorA(myComponet1);
//&#x900F;&#x660E;&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F;
myComponet1.operation();
// &#x53EF;&#x4EE5;&#x5728;&#x5916; &#x8C03;&#x7528;&#x589E;&#x5F3A;&#x65B9;&#x6CD5; - &#x7F16;&#x8BD1;ok
myComponet2.operationA();
myComponet2.operation();
</code></pre>
<h2 id="&#x5982;&#x4F55;&#x7406;&#x89E3;-&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;&#x4E0D;&#x80FD;&#x5B9E;&#x73B0;&#x5BF9;&#x540C;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;&#x591A;&#x6B21;&#x88C5;&#x9970;"><a name="&#x5982;&#x4F55;&#x7406;&#x89E3;-&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;&#x4E0D;&#x80FD;&#x5B9E;&#x73B0;&#x5BF9;&#x540C;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;&#x591A;&#x6B21;&#x88C5;&#x9970;" class="anchor-navigation-ex-anchor" href="#&#x5982;&#x4F55;&#x7406;&#x89E3;-&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;&#x4E0D;&#x80FD;&#x5B9E;&#x73B0;&#x5BF9;&#x540C;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;&#x591A;&#x6B21;&#x88C5;&#x9970;"><i class="fa fa-link" aria-hidden="true"></i></a>21.3. &#x5982;&#x4F55;&#x7406;&#x89E3; &#x201C;&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F;&#x4E0D;&#x80FD;&#x5B9E;&#x73B0;&#x5BF9;&#x540C;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;&#x591A;&#x6B21;&#x88C5;&#x9970;&#x201D;</h2>
<pre><code class="lang-text">&#x9996;&#x5148;&#x660E;&#x786E;&#x4E00;&#x70B9;&#xFF1A;&#x534A;&#x900F;&#x660E;&#x88C5;&#x9970;&#x6A21;&#x5F0F; &#x662F;&#x5C06; &#x589E;&#x5F3A;&#x65B9;&#x6CD5; &#x548C;&#x539F;&#x6709;&#x65B9;&#x6CD5; &#x72EC;&#x7ACB;&#x5F00;&#x6765;&#x7684;&#x3002;&#x5728;&#x88C5;&#x9970;&#x5668;&#x4E2D; &#x539F;&#x6709;&#x65B9;&#x6CD5;&#x5E76;&#x6CA1;&#x6709;&#x8C03;&#x7528;&#x8FC7;&#x589E;&#x5F3A;&#x65B9;&#x6CD5;&#x3002;    
&#x56E0;&#x4E3A;&#x88C5;&#x9970;&#x7C7B;&#x6301;&#x6709;&#x7684;&#x662F; MyComponent &#x7C7B;&#x578B;&#x7684;&#x5F15;&#x7528;&#xFF0C;&#x800C; MyComponent &#x5E76;&#x4E0D;&#x80FD;&#x8C03;&#x7528;&#x589E;&#x5F3A;&#x65B9;&#x6CD5;&#x3002;
&#x6240;&#x4EE5;&#x5BFC;&#x81F4;&#x5982;&#x4E0B;&#x7ED3;&#x679C;&#xFF1A; &#x591A;&#x6B21;&#x88C5;&#x9970;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x65E0;&#x6CD5;&#x4F7F;&#x7528;&#x90A3;&#x4E9B;&#x589E;&#x5F3A;&#x65B9;&#x6CD5;&#x3002;
</code></pre>
<h2 id="&#x4EE3;&#x7406;&#x6A21;&#x5F0F;-&#x4E0E;-&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F;-&#x533A;&#x522B;"><a name="&#x4EE3;&#x7406;&#x6A21;&#x5F0F;-&#x4E0E;-&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F;-&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x4EE3;&#x7406;&#x6A21;&#x5F0F;-&#x4E0E;-&#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F;-&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>21.4. &#x4EE3;&#x7406;&#x6A21;&#x5F0F; &#x4E0E; &#x88C5;&#x9970;&#x8005;&#x6A21;&#x5F0F; &#x533A;&#x522B;</h2>
<pre><code class="lang-text">&#x4EE3;&#x7406;&#x6A21;&#x5F0F; &#x5F3A;&#x8C03;&#x5BF9; &#x59D4;&#x6258;&#x5BF9;&#x8C61;&#x7684;&#x8BBF;&#x95EE; ( &#x4F8B;&#x5982;&#x60C5;&#x51B5;&#x4E0B; &#x59D4;&#x6258;&#x7C7B;&#x4E0D;&#x80FD;&#x6216;&#x8005;&#x4E0D;&#x60F3;&#x5BF9;&#x5916;&#x66B4;&#x9732;)&#x3002;
&#x88C5;&#x9970;&#x6A21;&#x5F0F; &#x5F3A;&#x8C03; &#x7ED9;&#x539F;&#x5BF9;&#x8C61;&#x589E;&#x52A0;&#x989D;&#x5916;&#x529F;&#x80FD;&#x3002;

&#x4E8C;&#x8005;&#x770B;&#x8D77;&#x6765;&#x7C7B;&#x4F3C;&#xFF0C;&#x4F46;&#x662F;&#x89E3;&#x51B3;&#x95EE;&#x9898;&#x7684;&#x51FA;&#x53D1;&#x70B9;&#x4E0D;&#x4E00;&#x6837;&#x3002;
</code></pre>
<h1 id="&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;--observer-pattern"><a name="&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;--observer-pattern" class="anchor-navigation-ex-anchor" href="#&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;--observer-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>22. &#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;  Observer Pattern</h1>
<pre><code class="lang-text">1&#x3001;Observer Pattern&#x7528;&#x4E8E;&#x5EFA;&#x7ACB;&#x4E00;&#x79CD;&#x5BF9;&#x8C61;&#x4E0E;&#x5BF9;&#x8C61;&#x4E4B;&#x95F4;&#x7684;&#x4F9D;&#x8D56;&#x5173;&#x7CFB;&#x3002;
&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x53D1;&#x751F;&#x6539;&#x53D8;&#x65F6;&#x5C06;&#x81EA;&#x52A8;&#x901A;&#x77E5;&#x5176;&#x4ED6;&#x5BF9;&#x8C61;&#xFF0C;&#x5176;&#x4ED6;&#x5BF9;&#x8C61;&#x5C06;&#x76F8;&#x5E94;&#x4F5C;&#x51FA;&#x53CD;&#x5E94;&#x3002;

2&#x3001;Observer Pattern&#x5305;&#x542B;1&#x4E2A;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x548C;n(n&gt;=1)&#x89C2;&#x5BDF;&#x8005;&#x4E24;&#x7C7B;&#x5BF9;&#x8C61;&#x3002;&#x4E00;&#x65E6;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x7684;&#x72B6;&#x6001;&#x53D1;&#x751F;&#x6539;&#x53D8;&#xFF0C;&#x6240;&#x6709;&#x7684;&#x89C2;&#x5BDF;&#x8005;&#x90FD;&#x5C06;&#x5F97;&#x5230;&#x901A;&#x77E5;&#x3002;

3&#x3001;&#x8FD9;&#x79CD;&#x4EA4;&#x4E92;&#x4E5F;&#x79F0;&#x4E3A;&#x53D1;&#x5E03;-&#x8BA2;&#x9605;(Publish-Subscribe)&#x3002;
&#x53D1;&#x5E03;&#x8005;&#x53D1;&#x51FA;&#x901A;&#x77E5;&#x65F6;&#x5E76;&#x4E0D;&#x9700;&#x8981;&#x77E5;&#x9053;&#x8C01;&#x662F;&#x5B83;&#x7684;&#x89C2;&#x5BDF;&#x8005;&#xFF0C;&#x53EF;&#x4EE5;&#x6709;&#x4EFB;&#x610F;&#x6570;&#x76EE;&#x7684;&#x89C2;&#x5BDF;&#x8005;&#x8BA2;&#x9605;&#x5B83;&#x5E76;&#x63A5;&#x6536;&#x901A;&#x77E5;&#x3002;
- 4&#x3001;&#x51E1;&#x662F;&#x6D89;&#x53CA;&#x5230;&#x4E00;&#x5BF9;&#x4E00;&#x6216;&#x8005;&#x4E00;&#x5BF9;&#x591A;&#x7684;&#x5BF9;&#x8C61;&#x4EA4;&#x4E92;&#x573A;&#x666F;&#x90FD;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;&#x3002;

// &#x4E3E;&#x4F8B;
1&#x3001;&#x4EA4;&#x901A;&#x4FE1;&#x53F7;&#x706F;&#x662F;&#x6C7D;&#x8F66;&#xFF08;&#x9A7E;&#x9A76;&#x5458;&#xFF09;&#x7684;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#xFF0C;&#x800C;&#x6C7D;&#x8F66;&#x662F;&#x89C2;&#x5BDF;&#x8005;&#x3002;
&#x968F;&#x7740;&#x4EA4;&#x901A;&#x4FE1;&#x53F7;&#x706F;&#x7684;&#x53D8;&#x5316;&#xFF0C;&#x6C7D;&#x8F66;&#x7684;&#x884C;&#x4E3A;&#x4E5F;&#x5C06;&#x968F;&#x4E4B;&#x800C;&#x53D8;&#x5316;&#xFF0C;&#x4E00;&#x76CF;&#x4EA4;&#x901A;&#x4FE1;&#x53F7;&#x706F;&#x53EF;&#x4EE5;&#x6307;&#x6325;&#x591A;&#x8F86;&#x6C7D;&#x8F66;&#x3002;

2&#x3001;&#x5728;&#x5F53;&#x524D;&#x6D41;&#x884C;&#x7684;MVC&#x67B6;&#x6784;&#x4E2D;&#x4E5F;&#x5E94;&#x7528;&#x4E86;&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;&#xFF0C;&#x5B83;&#x5305;&#x542B;&#x4E09;&#x4E2A;&#x89D2;&#x8272;&#xFF1A;&#x6A21;&#x578B;(Model)&#xFF0C;&#x89C6;&#x56FE;(View)&#x548C;&#x63A7;&#x5236;&#x5668;(Controller)&#x3002;
&#x5176;&#x4E2D;&#x6A21;&#x578B;&#x53EF;&#x5BF9;&#x5E94;&#x4E8E;&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;&#x4E2D;&#x7684;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#xFF0C;&#x800C;&#x89C6;&#x56FE;&#x5BF9;&#x5E94;&#x4E8E;&#x89C2;&#x5BDF;&#x8005;&#xFF0C;&#x63A7;&#x5236;&#x5668;&#x53EF;&#x5145;&#x5F53;&#x4E24;&#x8005;&#x4E4B;&#x95F4;&#x7684;&#x4E2D;&#x4ECB;&#x8005;&#x3002;
&#x5F53;&#x6A21;&#x578B;&#x5C42;&#x7684;&#x6570;&#x636E;&#x53D1;&#x751F;&#x6539;&#x53D8;&#x65F6;&#xFF0C;&#x89C6;&#x56FE;&#x5C42;&#x5C06;&#x81EA;&#x52A8;&#x6539;&#x53D8;&#x5176;&#x663E;&#x793A;&#x5185;&#x5BB9;&#x3002;

3&#x3001;&#x90AE;&#x4EF6;&#x8BA2;&#x9605;&#x548C;RSS&#x8BA2;&#x9605;&#xFF0C;&#x5F53;&#x6211;&#x4EEC;&#x6D4F;&#x89C8;&#x4E00;&#x4E9B;&#x535A;&#x5BA2;&#x6216;wiki&#x65F6;&#xFF0C;&#x5F53;&#x4F60;&#x8BA2;&#x9605;&#x4E86;&#x8BE5;&#x6587;&#x7AE0;&#xFF0C;&#x5982;&#x679C;&#x540E;&#x7EED;&#x6709;&#x66F4;&#x65B0;&#xFF0C;&#x4F1A;&#x53CA;&#x65F6;&#x901A;&#x77E5;&#x4F60;&#x3002;
</code></pre>
<h2 id="&#x89C2;&#x5BDF;&#x76EE;&#x6807;"><a name="&#x89C2;&#x5BDF;&#x76EE;&#x6807;" class="anchor-navigation-ex-anchor" href="#&#x89C2;&#x5BDF;&#x76EE;&#x6807;"><i class="fa fa-link" aria-hidden="true"></i></a>22.1. &#x89C2;&#x5BDF;&#x76EE;&#x6807;</h2>
<p>Observer Pattern&#x4E2D;&#xFF0C;&#x53D1;&#x751F;&#x6539;&#x53D8;&#x7684;&#x5BF9;&#x8C61;&#x79F0;&#x4E3A;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x3002;</p>
<h2 id="&#x89C2;&#x5BDF;&#x8005;"><a name="&#x89C2;&#x5BDF;&#x8005;" class="anchor-navigation-ex-anchor" href="#&#x89C2;&#x5BDF;&#x8005;"><i class="fa fa-link" aria-hidden="true"></i></a>22.2. &#x89C2;&#x5BDF;&#x8005;</h2>
<pre><code class="lang-text">&#x800C;&#x88AB;&#x901A;&#x77E5;&#x7684;&#x5BF9;&#x8C61;&#x79F0;&#x4E3A;&#x89C2;&#x5BDF;&#x8005;&#x3002;
1&#x3001;&#x4E00;&#x4E2A;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x53EF;&#x4EE5;&#x5BF9;&#x5E94;&#x591A;&#x4E2A;&#x89C2;&#x5BDF;&#x8005;&#x3002;
2&#x3001;&#x8FD9;&#x4E9B;&#x89C2;&#x5BDF;&#x8005;&#x4E4B;&#x95F4;&#x53EF;&#x4EE5;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x76F8;&#x4E92;&#x8054;&#x7CFB;&#x3002;
3&#x3001;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x9700;&#x8981;&#x589E;&#x52A0;&#x548C;&#x5220;&#x9664;&#x89C2;&#x5BDF;&#x8005;&#xFF0C;&#x4F7F;&#x5F97;&#x7CFB;&#x7EDF;&#x66F4;&#x6613;&#x4E8E;&#x6269;&#x5C55;&#x3002;
</code></pre>
<h2 id="&#x4F18;&#x7F3A;&#x70B9;_6"><a name="&#x4F18;&#x7F3A;&#x70B9;_6" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x7F3A;&#x70B9;_6"><i class="fa fa-link" aria-hidden="true"></i></a>22.3. &#x4F18;&#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">// &#x4F18;&#x70B9;
1&#x3001;&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x8868;&#x793A;&#x5C42;&#x548C;&#x6570;&#x636E;&#x903B;&#x8F91;&#x5C42;&#x7684;&#x5206;&#x79BB;&#xFF0C;&#x5B9A;&#x4E49;&#x4E86;&#x7A33;&#x5B9A;&#x7684;&#x6D88;&#x606F;&#x66F4;&#x65B0;&#x4F20;&#x9012;&#x673A;&#x5236;&#xFF0C;&#x5E76;&#x62BD;&#x8C61;&#x4E86;&#x66F4;&#x65B0;&#x63A5;&#x53E3;&#xFF0C;
&#x4F7F;&#x5F97;&#x53EF;&#x4EE5;&#x6709;&#x5404;&#x79CD;&#x5404;&#x6837;&#x4E0D;&#x540C;&#x7684;&#x8868;&#x793A;&#x5C42;&#x5145;&#x5F53;&#x5177;&#x4F53;&#x89C2;&#x5BDF;&#x8005;&#x89D2;&#x8272;&#x3002;

2&#x3001;&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;&#x5728;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x548C;&#x89C2;&#x5BDF;&#x8005;&#x4E4B;&#x95F4;&#x5EFA;&#x7ACB;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x7684;&#x8026;&#x5408;&#x3002;
&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x53EA;&#x9700;&#x8981;&#x7EF4;&#x6301;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x89C2;&#x5BDF;&#x8005;&#x7684;&#x96C6;&#x5408;&#xFF0C;&#x65E0;&#x987B;&#x4E86;&#x89E3;&#x5176;&#x5177;&#x4F53;&#x89C2;&#x5BDF;&#x8005;&#x3002;

3&#x3001;&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;&#x652F;&#x6301;&#x5E7F;&#x64AD;&#x901A;&#x4FE1;&#xFF0C;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x4F1A;&#x5411;&#x6240;&#x6709;&#x5DF2;&#x6CE8;&#x518C;&#x7684;&#x89C2;&#x5BDF;&#x8005;&#x5BF9;&#x8C61;&#x53D1;&#x9001;&#x901A;&#x77E5;&#xFF0C;&#x7B80;&#x5316;&#x4E86;&#x4E00;&#x5BF9;&#x591A;&#x7CFB;&#x7EDF;&#x8BBE;&#x8BA1;&#x7684;&#x96BE;&#x5EA6;&#x3002;

4&#x3001;&#x89C2;&#x5BDF;&#x8005;&#x6A21;&#x5F0F;&#x6EE1;&#x8DB3;&#x201C;&#x5F00;&#x95ED;&#x539F;&#x5219;&#x201D;&#x7684;&#x8981;&#x6C42;&#xFF0C;&#x589E;&#x52A0;&#x65B0;&#x7684;&#x5177;&#x4F53;&#x89C2;&#x5BDF;&#x8005;&#x65E0;&#x987B;&#x4FEE;&#x6539;&#x539F;&#x6709;&#x7CFB;&#x7EDF;&#x4EE3;&#x7801;&#xFF0C;
&#x800C;&#x4E14;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x548C;&#x89C2;&#x5BDF;&#x8005;&#x6CA1;&#x6709;&#x7D27;&#x5BC6;&#x5730;&#x8026;&#x5408;&#x5728;&#x4E00;&#x8D77;&#xFF0C;&#x56E0;&#x6B64;&#x5B83;&#x4EEC;&#x53EF;&#x4EE5;&#x5C5E;&#x4E8E;&#x4E0D;&#x540C;&#x7684;&#x62BD;&#x8C61;&#x5316;&#x5C42;&#x6B21;&#x3002;
&#x5728;&#x5177;&#x4F53;&#x89C2;&#x5BDF;&#x8005;&#x4E0E;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x4E4B;&#x95F4;&#x4E0D;&#x5B58;&#x5728;&#x5173;&#x8054;&#x5173;&#x7CFB;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x589E;&#x52A0;&#x65B0;&#x7684;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x4E5F;&#x5F88;&#x65B9;&#x4FBF;&#x3002;

// &#x7F3A;&#x70B9;
1&#x3001;&#x82E5;&#x4E00;&#x4E2A;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x5BF9;&#x8C61;&#x6709;&#x5F88;&#x591A;&#x76F4;&#x63A5;&#x548C;&#x95F4;&#x63A5;&#x89C2;&#x5BDF;&#x8005;&#xFF0C;&#x5C06;&#x6240;&#x6709;&#x7684;&#x89C2;&#x5BDF;&#x8005;&#x90FD;&#x901A;&#x77E5;&#x5230;&#x4F1A;&#x8017;&#x65F6;&#x8FC7;&#x591A;&#x3002;
2&#x3001;&#x82E5;&#x89C2;&#x5BDF;&#x8005;&#x548C;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x4E4B;&#x95F4;&#x5B58;&#x5728;&#x5FAA;&#x73AF;&#x4F9D;&#x8D56;&#xFF0C;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x4F1A;&#x89E6;&#x53D1;&#x5B83;&#x4EEC;&#x4E4B;&#x95F4;&#x8FDB;&#x884C;&#x5FAA;&#x73AF;&#x8C03;&#x7528;&#xFF0C;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x7CFB;&#x7EDF;&#x5D29;&#x6E83;&#x3002;
3&#x3001;Observer Pattern&#x6CA1;&#x6709;&#x76F8;&#x5E94;&#x7684;&#x673A;&#x5236;&#x8BA9;&#x89C2;&#x5BDF;&#x8005;&#x77E5;&#x9053;&#x6240;&#x89C2;&#x5BDF;&#x7684;&#x76EE;&#x6807;&#x5BF9;&#x8C61;&#x662F;&#x600E;&#x4E48;&#x53D1;&#x751F;&#x53D8;&#x5316;&#x7684;&#xFF0C;&#x800C;&#x4EC5;&#x4EC5;&#x53EA;&#x662F;&#x77E5;&#x9053;&#x89C2;&#x5BDF;&#x76EE;&#x6807;&#x53D1;&#x751F;&#x4E86;&#x53D8;&#x5316;&#x3002;
</code></pre>
<h2 id="demo_7"><a name="demo_7" class="anchor-navigation-ex-anchor" href="#demo_7"><i class="fa fa-link" aria-hidden="true"></i></a>22.4. demo:</h2>
<pre><code class="lang-text">// &#x89C2;&#x5BDF;&#x8005;&#x62BD;&#x8C61;&#x7C7B;&#xFF0C;&#x5B9A;&#x4E49;&#x5171;&#x540C;&#x7684;&#x884C;&#x4E3A;
public interface Observer{
  public void update();
}
// &#x5177;&#x4F53;&#x7684;&#x89C2;&#x5BDF;&#x8005; 1
public class Observer1 implements  Observer{
    @Override
    public void update(){
        System.out.println(&quot;&#x89C2;&#x5BDF;&#x8005; 1&#x6536;&#x5230;&#x901A;&#x77E5;&quot;);
    }
}//
// &#x5177;&#x4F53;&#x7684;&#x89C2;&#x5BDF;&#x8005; 2
public class Observer2 implements  Observer{
    @Override
    public void update(){
        System.out.println(&quot;&#x89C2;&#x5BDF;&#x8005; 2&#x6536;&#x5230;&#x901A;&#x77E5;&quot;);
    }
}//

// &#x88AB;&#x89C2;&#x5BDF;&#x8005;&#x63A5;&#x53E3;&#x3002;&#x5B9A;&#x4E49;&#x4E00;&#x4E9B; &#x65B9;&#x6CD5;&#x7528;&#x6765;&#x7BA1;&#x7406; &#x89C2;&#x5BDF;&#x8005;&#x96C6;&#x5408;&#x3002;
public interface Subject{
    /**&#x6DFB;&#x52A0;&#x89C2;&#x5BDF;&#x8005;*/
    public void addObserver(Observer observer) ;
    /**&#x5220;&#x9664;&#x89C2;&#x5BDF;&#x8005;*/
    public void delObserver(Observer observer) ;
    /**&#x901A;&#x77E5;&#x89C2;&#x5BDF;&#x8005;*/
    public void notifyAllObservers();
}//

//  &#x5177;&#x4F53;&#x7684; &#x88AB;&#x89C2;&#x5BDF;&#x8005; 
public class MySubject implements Subject{
    /**&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x7684;&#x96C6;&#x5408;*/
    private Vector&lt;Observer&gt; myObservers ;
    /**&#x6784;&#x9020;&#x51FD;&#x6570;*/
    public MySubject () {
        myObservers = new Vector&lt;Observer&gt;();
    }
    @Override
    public void addObserver(Observer observer) {
        myObservers.add(observer) ;
    }
    @Override
    public void delObserver(Observer observer) {
        myObservers.remove(observer) ;
    }
    @Override
    public void notifyAllObservers() {
        //&#x4F7F;&#x7528;&#x8FED;&#x4EE3;&#x5668;&#x83B7;&#x53D6;&#x6240;&#x6709;&#x89C2;&#x5BDF;&#x8005; &#x5E76;&#x901A;&#x77E5;
        Iterator&lt;Observer&gt; iterator = myObservers.iterator() ;
        while (iterator.hasNext())     {
            Observer observer =  iterator.next();
            observer.update();
        }//
    }//
}

/**&#x5B9E;&#x9645;&#x573A;&#x666F;&#x5E94;&#x7528;*/
public static void main(String[] args) {
  Observer1 ob1 = new Observer1() ;
  Observer2 ob2 = new Observer2() ;
  MySubject mySubject = new MySubject() ;
  mySubject.addObserver(ob1);
  mySubject.addObserver(ob2);
  mySubject.notifyAllObservers() ;
}//
</code></pre>
<h1 id="&#x89E3;&#x91CA;&#x5668;&#x6A21;&#x5F0F;-interpreter-pattern"><a name="&#x89E3;&#x91CA;&#x5668;&#x6A21;&#x5F0F;-interpreter-pattern" class="anchor-navigation-ex-anchor" href="#&#x89E3;&#x91CA;&#x5668;&#x6A21;&#x5F0F;-interpreter-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>23. &#x89E3;&#x91CA;&#x5668;&#x6A21;&#x5F0F; Interpreter Pattern</h1>
<p>&#x8FD8;&#x672A;&#x5B8C;&#x5168;&#x7406;&#x89E3;&#x3002; &#x7B49;&#x8FC7;&#x6BB5;&#x65F6;&#x95F4;&#x518D;&#x6765;&#x66F4;&#x65B0;....</p>
<p><del>&#x89E3;&#x91CA;&#x5668;&#x6A21;&#x5F0F;&#x4E3A;&#x81EA;&#x5B9A;&#x4E49;&#x8BED;&#x8A00;&#x7684;&#x8BBE;&#x8BA1;&#x548C;&#x5B9E;&#x73B0;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x79CD;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x5B83;&#x7528;&#x4E8E;&#x5B9A;&#x4E49;&#x4E00;&#x7EC4;&#x6587;&#x6CD5;&#x89C4;&#x5219;&#x5E76;&#x901A;&#x8FC7;&#x8FD9;&#x7EC4;&#x6587;&#x6CD5;&#x89C4;&#x5219;&#x6765;&#x89E3;&#x91CA;&#x81EA;&#x5B9A;&#x4E49;&#x8BED;&#x8A00;&#x4E2D;&#x7684;&#x53E5;&#x5B50;&#x3002;</del></p>
<p><del>#### &#x5E94;&#x7528;&#x573A;&#x666F;
1&#x3001;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;&#x89E3;&#x91CA;&#x5668;
2&#x3001;SQL&#x8BED;&#x6CD5;&#x7684;&#x89E3;&#x91CA;&#x5668;</del></p>
<table>
<thead>
<tr>
<th>&#x76F8;&#x5173;&#x6982;&#x5FF5;</th>
<th>&#x7279;&#x70B9;</th>
<th>&#x4E3E;&#x4F8B;</th>
</tr>
</thead>
<tbody>
<tr>
<td>&#x7EC8;&#x7ED3;&#x7B26;&#xFF08;&#x8868;&#x8FBE;&#x5F0F;&#xFF09;</td>
<td>&#x4E0D;&#x53EF;&#x62C6;&#x5206;&#x7684;&#x6700;&#x5C0F;&#x5143;&#x7D20;&#x3002; &#x4E00;&#x4E2A;&#x8BED;&#x6CD5;&#x7684;&#x89C4;&#x5219;&#x4E0D;&#x80FD;&#x6539;&#x53D8;&#x7EC8;&#x7ED3;&#x7B26;&#x3002;</td>
<td>x -&gt; xa  a&#x662F;&#x7EC8;&#x7ED3;&#x7B26;</td>
</tr>
<tr>
<td>&#x975E;&#x7EC8;&#x7ED3;&#x7B26;&#xFF08;&#x8868;&#x8FBE;&#x5F0F;&#xFF09;</td>
<td>&#x53EF;&#x62C6;&#x5206;&#x5143;&#x7D20;&#x3002; &#x975E;&#x7EC8;&#x7ED3;&#x7B26;&#x662F;&#x53EF;&#x4EE5;&#x88AB;&#x53D6;&#x4EE3;&#x7684;&#x5143;&#x7D20;&#x3002;&#x8FD0;&#x7B97;&#x7B26;&#x4E5F;&#x662F;&#x975E;&#x7EC8;&#x7ED3;&#x7B26;</td>
<td>x -&gt; xa  x &#x662F;&#x975E;&#x7EC8;&#x7ED3;&#x7B26;</td>
</tr>
<tr>
<td>&#x8BED;&#x8A00;&#x7684;&#x6587;&#x6CD5;&#x89C4;&#x5219;</td>
<td>&#x5373;&#x8BED;&#x6CD5;&#x89C4;&#x5219;&#x3002;&#x62E5;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x8868;&#x8FBE;&#x5F0F;&#x548C;&#x7ED3;&#x6784;&#x3002;</td>
<td></td>
</tr>
<tr>
<td>&#x62BD;&#x8C61;&#x8BED;&#x6CD5;&#x6811;(Abstract Syntax Tree, AST)</td>
<td>&#x7528;&#x6765;&#x76F4;&#x89C2;&#x5730;&#x8868;&#x793A;&#x8BED;&#x8A00;&#x7684;&#x6784;&#x6210;&#x3002;  &#x6BCF;&#x4E00;&#x68F5;&#x62BD;&#x8C61;&#x8BED;&#x6CD5;&#x6811;&#x5BF9;&#x5E94;&#x4E00;&#x4E2A;&#x8BED;&#x8A00;&#x5B9E;&#x4F8B;&#x3002; &#x7EC8;&#x7ED3;&#x7B26;&#x8868;&#x8FBE;&#x5F0F;&#x7C7B;&#x7684;&#x5B9E;&#x4F8B;&#x4F5C;&#x4E3A;&#x6811;&#x7684;&#x53F6;&#x5B50;&#x8282;&#x70B9;&#xFF0C;&#x975E;&#x7EC8;&#x7ED3;&#x7B26;&#x8868;&#x8FBE;&#x5F0F;&#x7C7B;&#x7684;&#x5B9E;&#x4F8B;&#x4F5C;&#x4E3A;&#x975E;&#x53F6;&#x5B50;&#x8282;&#x70B9;&#x3002;  &#x901A;&#x8FC7;&#x5BF9;&#x62BD;&#x8C61;&#x8BED;&#x6CD5;&#x6811;&#x7684;&#x5206;&#x6790;&#xFF0C;&#x53EF;&#x4EE5;&#x8BC6;&#x522B;&#x51FA;&#x8BED;&#x8A00;&#x4E2D;&#x7684;&#x7EC8;&#x7ED3;&#x7B26;&#x7C7B;&#x548C;&#x975E;&#x7EC8;&#x7ED3;&#x7B26;&#x7C7B;&#x3002;</td>
<td></td>
</tr>
<tr>
<td>&#x73AF;&#x5883;&#x89D2;&#x8272;</td>
<td>&#x5B58;&#x653E;&#x6587;&#x6CD5;&#x4E2D;&#x5404;&#x4E2A;&#x7EC8;&#x7ED3;&#x7B26;&#x6240;&#x5BF9;&#x5E94;&#x7684;&#x5177;&#x4F53;&#x503C;</td>
<td></td>
</tr>
</tbody>
</table>
<p><del>#### &#x793A;&#x4F8B;
Java&#x65E0;&#x6CD5;&#x76F4;&#x63A5;&#x89E3;&#x91CA;&#x7C7B;&#x4F3C;&#x201C;1+ 2 + 3 &#x2013; 4 + 1&#x201D;&#x8FD9;&#x6837;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x3002; &#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x81EA;&#x5DF1;&#x5B9A;&#x4E49; &#x4E00;&#x4E2A;&#x89E3;&#x91CA;&#x5668;&#x6765;&#x89E3;&#x91CA;&#x8FD9;&#x4E2A;&#x8BED;&#x53E5; &#x3002;</del></p>
<p><del>&#x4E00;&#x4E9B;&#x91CD;&#x590D;&#x53D1;&#x751F;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6BD4;&#x5982;&#x52A0;&#x51CF;&#x4E58;&#x9664;&#x56DB;&#x5219;&#x8FD0;&#x7B97;&#xFF0C;&#x4F46;&#x662F;&#x516C;&#x5F0F;&#x6BCF;&#x6B21;&#x90FD;&#x4E0D;&#x540C;&#xFF0C;&#x6709;&#x65F6;&#x662F;a+b-c<em>d&#xFF0C;&#x6709;&#x65F6;&#x662F;a</em>b+c-d&#xFF0C;&#x7B49;&#x7B49;&#x7B49;&#x7B49;&#x4E2A;&#xFF0C;&#x516C;&#x5F0F;&#x5343;&#x53D8;&#x4E07;&#x5316;&#xFF0C;&#x4F46;&#x662F;&#x90FD;&#x662F;&#x7531;&#x52A0;&#x51CF;&#x4E58;&#x9664;&#x56DB;&#x4E2A;&#x975E;&#x7EC8;&#x7ED3;&#x7B26;&#x6765;&#x8FDE;&#x63A5;&#x7684;&#xFF0C;&#x8FD9;&#x65F6;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x89E3;&#x91CA;&#x5668;&#x6A21;&#x5F0F;&#x3002;</del></p>
<p><del>#### &#x7F3A;&#x70B9;
1&#x3001; &#x6267;&#x884C;&#x6548;&#x7387;&#x4F4E;&#x3002;
2&#x3001; &#x7EF4;&#x62A4;&#x56F0;&#x96BE;&#x3002;</del></p>
<h1 id="&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;--visitor-pattern"><a name="&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;--visitor-pattern" class="anchor-navigation-ex-anchor" href="#&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;--visitor-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>24. &#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;  Visitor Pattern</h1>
<pre><code class="lang-text">&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;&#x628A;  &#x6570;&#x636E;&#x7ED3;&#x6784; &#x548C; &#x4F5C;&#x7528;&#x4E8E;&#x7ED3;&#x6784;&#x4E0A;&#x7684;&#x64CD;&#x4F5C; &#x89E3;&#x8026;&#x5408; &#x3002;
&#x9002;&#x7528;&#x4E8E;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x76F8;&#x5BF9;&#x7A33;&#x5B9A;&#x7B97;&#x6CD5;&#x53C8;&#x6613;&#x53D8;&#x5316;&#x7684;&#x573A;&#x666F;&#x3002;
</code></pre>
<h2 id="demo_8"><a name="demo_8" class="anchor-navigation-ex-anchor" href="#demo_8"><i class="fa fa-link" aria-hidden="true"></i></a>24.1. demo</h2>
<p>&#x4EE5;&#x516C;&#x53F8;&#x5458;&#x5DE5;&#x548C;&#x90E8;&#x95E8;&#x7684;&#x5173;&#x7CFB;&#x4E3A;&#x573A;&#x666F;&#x3002;</p>
<pre><code class="lang-text">/**&#x5168;&#x804C;&#x5458;&#x5DE5;*/
public class FulltimeEmployee implements Employee  {
    public FulltimeEmployee(String name, int workTime) {...}
    /**&#x6BCF;&#x4E2A;&#x5BF9;&#x8C61;&#x90FD;&#x4F1A;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;*/
    @Override
    public void accept(Department handler) {
        //&#x6BCF;&#x4E2A;&#x8BBF;&#x95EE;&#x8005;&#x90FD;&#x4F1A;&#x6709;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;
        handler.visit(this);
    }
}

/**&#x4EBA;&#x529B;&#x8D44;&#x6E90;&#x90E8;&#x7C7B;&#xFF1A;&#x5177;&#x4F53;&#x8BBF;&#x95EE;&#x8005;&#x7C7B;*/
public class HRDepartment implements Department {
    /**&#x6240;&#x6709;&#x8BBF;&#x95EE;&#x8005;&#x90FD;&#x4F1A;&#x91CD;&#x8F7D; &#x6240;&#x6709; visit&#x65B9;&#x6CD5;*/
    @Override
    public void visit(FulltimeEmployee employee) {  ... }
    /***&#x6240;&#x6709;&#x8BBF;&#x95EE;&#x8005;&#x90FD;&#x4F1A;&#x91CD;&#x8F7D; &#x6240;&#x6709; visit&#x65B9;&#x6CD5; */
    @Override
    public void visit(ParttimeEmployee employee) { ...  }
}

//&#x4F7F;&#x7528;&#x3002;&#x8BBF;&#x95EE;&#x8005;&#x4E0D;&#x540C;&#xFF0C;&#x4F1A;&#x505A;&#x51FA;&#x4E0D;&#x540C;&#x7684;&#x5904;&#x7406;&#x7ED3;&#x679C;
Employee  employee = new FulltimeEmployee(...);
Department dep = new HRDepartment(....) ;
//Department dep = new FADepartment (....) ;
employee.accept(dep);
</code></pre>
<h2 id="&#x4F18;&#x7F3A;&#x70B9;_7"><a name="&#x4F18;&#x7F3A;&#x70B9;_7" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x7F3A;&#x70B9;_7"><i class="fa fa-link" aria-hidden="true"></i></a>24.2. &#x4F18;&#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">// &#x4F18;&#x70B9;
1&#x3001;&#x65B9;&#x4FBF;&#x5B9A;&#x4E49; &#x65B0;&#x7684;&#x8BBF;&#x95EE;&#x8005;&#xFF0C;&#x5B9E;&#x73B0;&#x65B0;&#x7684;&#x6570;&#x636E;&#x64CD;&#x4F5C;&#x3002;
//Department dep = new HRDepartment(....) ;
//&#x5B9A;&#x4E49;&#x65B0;&#x7684;&#x8BBF;&#x95EE;&#x8005;
Department dep = new FADepartment (....) ;

// &#x7F3A;&#x70B9;
1&#x3001;&#x8FDD;&#x80CC;&#x4E86;&quot;&#x4F9D;&#x8D56;&#x5012;&#x7F6E;&#x539F;&#x5219;&quot; &#x3002;&#x8BBF;&#x95EE;&#x8005;&#x4F9D;&#x8D56;&#x7684;&#x662F;&#x5177;&#x4F53;&#x5143;&#x7D20;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x62BD;&#x8C61;&#x5143;&#x7D20;&#x3002;
public void visit(FulltimeEmployee employee) {  ... }

2&#x3001;&#x589E;&#x52A0;&#x65B0;&#x7684;&#x5143;&#x7D20;&#x7C7B;&#x6BD4;&#x8F83;&#x56F0;&#x96BE;&#x3002;
&#x6BCF;&#x589E;&#x52A0;&#x4E00;&#x4E2A;&#x5143;&#x7D20;&#x7C7B; , &#x8BBF;&#x95EE;&#x8005;&#x5C31;&#x8981;&#x591A;&#x52A0;&#x4E00;&#x4E2A;visit()&#x3002;
// &#x6709; n&#x4E2A;&#x5143;&#x7D20;&#x7C7B; &#x5C31;&#x6709; n &#x4E2A;visit &#x65B9;&#x6CD5;
@Override
public void visit(FulltimeEmployee employee) {  ... }
....
@Override
public void visit(ParttimeEmployee employee) { ...  }
</code></pre>
<h2 id="&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><a name="&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;" class="anchor-navigation-ex-anchor" href="#&#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F;-&#x548C;-&#x7B56;&#x7565;&#x6A21;&#x5F0F;-&#x7684;&#x533A;&#x522B;"><i class="fa fa-link" aria-hidden="true"></i></a>24.3. &#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F; &#x548C; &#x7B56;&#x7565;&#x6A21;&#x5F0F; &#x7684;&#x533A;&#x522B;</h2>
<pre><code class="lang-text">&#x6211;&#x4E2A;&#x4EBA;&#x611F;&#x89C9;&#x8FD9;&#x4E24;&#x4E2A;&#x6A21;&#x5F0F;&#x5DEE;&#x4E0D;&#x591A;&#x3002; &#x4E2A;&#x4EBA;&#x4F53;&#x4F1A;&#x5230;&#x7684;&#x533A;&#x522B;&#xFF1A;  
1&#x3001;&#x7B56;&#x7565;&#x6A21;&#x5F0F;&#x662F;&#x901A;&#x8FC7;&#x6784;&#x9020;&#x65B9;&#x6CD5;&#x5C06;&#x7B56;&#x7565;&#x4F20;&#x8FDB;&#x53BB;&#x7684; &#x3002; &#x8BBF;&#x95EE;&#x8005;&#x6A21;&#x5F0F; &#x662F;&#x901A;&#x8FC7;&#x666E;&#x901A;&#x7684;&#x65B9;&#x6CD5; accept() &#x5C06;&#x8BBF;&#x95EE;&#x8005;&#xFF08;&#x7B56;&#x7565;&#xFF09;&#x4F20;&#x8FDB;&#x7684;&#x3002;
2&#x3001; &#x4F53;&#x73B0;&#x5728;&#x5B9A;&#x4E49;&#x67B6;&#x6784;&#x4E0A;
public class HRDepartment implements Department {
    @Override
    public void visit(FulltimeEmployee employee) {  ... }
    ...
    @Override
    public void visit(ParttimeEmployee employee) { ...  }
}
</code></pre>
<h1 id="&#x8D23;&#x4EFB;&#x94FE;&#x6A21;&#x5F0F;"><a name="&#x8D23;&#x4EFB;&#x94FE;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x8D23;&#x4EFB;&#x94FE;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>25. &#x8D23;&#x4EFB;&#x94FE;&#x6A21;&#x5F0F;</h1>
<p>Chain of Responsibility Pattern</p>
<pre><code class="lang-text">&#x5176;&#x5B9E; &#xFF0C;swith &#x3001;if-else &#x4F53;&#x73B0;&#x4E86;&#x6700;&#x7B80;&#x5355;&#x7684;&#x8D23;&#x4EFB;&#x94FE;&#x601D;&#x60F3; &#x3002;&#x53EA;&#x662F;&#x8FD9;&#x79CD;&#x5199;&#x6CD5; &#x6BD4;&#x8F83;&#x81C3;&#x80BF;&#x3001;&#x8026;&#x5408;&#x5EA6;&#x9AD8;&#x3002;
</code></pre>
<h2 id="&#x4F18;&#x7F3A;&#x70B9;_8"><a name="&#x4F18;&#x7F3A;&#x70B9;_8" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x7F3A;&#x70B9;_8"><i class="fa fa-link" aria-hidden="true"></i></a>25.1. &#x4F18;&#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">// &#x4F18;&#x70B9;
1&#x3001;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;&#x6CBF;&#x7740;&#x4E00;&#x6761;&#x201C;&#x94FE;&#x201D;&#x4F20;&#x9012;&#xFF0C;&#x7533;&#x8BF7;&#x8005;&#x4E0D;&#x9700;&#x8981;&#x77E5;&#x9053;&#x662F;&#x8C01;&#x6765;&#x6279;&#x51C6;&#x8FD9;&#x4E2A;&#x8BF7;&#x6C42;&#x3002; 
&#x6279;&#x9605;&#x8005;&#x4E5F;&#x4E0D;&#x9700;&#x8981;&#x8FD9;&#x4E2A;&#x8BF7;&#x6C42;&#x6765;&#x81EA;&#x8C01;&#x3002; &#x8FD9;&#x6837;&#x5C06; &#x7533;&#x8BF7;&#x8005;&#x548C;&#x6279;&#x9605;&#x8005;&#x4F18;&#x96C5;&#x5730;&#x89E3;&#x8026;&#x4E86;&#x3002;
2&#x3001;&#x5BB9;&#x6613;&#x62D3;&#x5C55;&#x8D23;&#x4EFB;&#x94FE;
// &#x7F3A;&#x70B9;
1&#x3001;&#x9700;&#x8981;&#x5BF9;&#x94FE;&#x4E2D;&#x8D23;&#x4EFB;&#x4EBA;&#x7684;&#x904D;&#x5386;&#xFF0C;&#x5982;&#x679C;&#x8D23;&#x4EFB;&#x4EBA;&#x592A;&#x591A;&#x90A3;&#x4E48;&#x904D;&#x5386;&#x5FC5;&#x5B9A;&#x4F1A;&#x5F71;&#x54CD;&#x6027;&#x80FD;&#x3002;
2&#x3001;&#x8BF7;&#x6C42;&#x4E0D;&#x4E00;&#x5B9A;&#x4F1A;&#x88AB;&#x5904;&#x7406;&#x6389;&#x3002;
</code></pre>
<h2 id="demo_9"><a name="demo_9" class="anchor-navigation-ex-anchor" href="#demo_9"><i class="fa fa-link" aria-hidden="true"></i></a>25.2. demo</h2>
<pre><code class="lang-text">/**&#x8D23;&#x4EFB;&#x4EBA;&#x7684;&#x5904;&#x7406;&#x65B9;&#x6CD5;*/
public void handleRequest(ProgramApe ape){
    if ( &#x6709;&#x5904;&#x7406;&#x6743;&#x9650;) {
        // &#x81EA;&#x5DF1;&#x5904;&#x7406;&#x6389;...
    } else {
        if (null != mSuperiorLeader) {
           //&#x5982;&#x679C;&#x81EA;&#x5DF1;&#x6CA1;&#x6709;&#x6743;&#x9650;&#x5904;&#x7406;&#xFF0C; &#x5C31;&#x4EA4;&#x7ED9;&#x4E0A;&#x7EA7;&#x5904;&#x7406;
        } else {
          //&#x5982;&#x679C;&#x81EA;&#x5DF1;&#x6CA1;&#x6709;&#x6743;&#x9650;&#x5904;&#x7406;&#xFF0C; &#x4E5F;&#x6CA1;&#x6709;&#x5176;&#x4ED6;&#x9886;&#x5BFC;&#x3002;&#x5C31;&#x629B;&#x51FA;&#x9519;&#x8BEF;&#xFF0C;&#x63D0;&#x793A;&#x8BE5;
      //&#x8BF7;&#x6C42;&#x6CA1;&#x6709;&#x88AB;&#x5904;&#x7406;&#x6389;
        }
    }
}

//&#x5E94;&#x7528;&#x573A;&#x666F;
//&#x5148;&#x6765;&#x4E00;&#x4E2A;&#x7A0B;&#x5E8F;&#x733F; &#x8FD9;&#x91CC;&#x7ED9;&#x4ED6;&#x4E00;&#x4E2A;&#x4E09;&#x4E07;&#x4EE5;&#x5185;&#x7684;&#x968F;&#x673A;&#x503C;&#x8868;&#x793A;&#x9700;&#x8981;&#x7533;&#x8BF7;&#x7684;&#x5DEE;&#x65C5;&#x8D39;
ProgramApe ape = new ProgramApe((int) (Math.random() * 30000));
//&#x518D;&#x6765;&#x56DB;&#x4E2A;&#x9886;&#x5BFC;
Leader leader = new GroupLeader();
Leader director = new Director();
Leader manager = new Manager();
Leader boss = new Boss();
//&#x4E8B;&#x5148;&#x8BBE;&#x7F6E;&#x597D; &#x8D23;&#x4EFB;&#x94FE;&#x4E4B;&#x95F4;&#x7684;&#x8FDE;&#x63A5;&#x5173;&#x7CFB;
leader.setLeader(director);
director.setLeader(manager);
manager.setLeader(boss);
// &#x63D0;&#x4EA4;&#x7533;&#x8BF7;&#xFF08;&#x4E0D;&#x7528;&#x5199; if else &#x7E41;&#x7410;&#x4EE3;&#x7801;&#xFF09;
leader.handleRequest(ape);
</code></pre>
<h1 id="&#x8FED;&#x4EE3;&#x5668;&#x6A21;&#x5F0F;-iterator-pattern-&#x3001;&#x6E38;&#x6807;&#x6A21;&#x5F0F;"><a name="&#x8FED;&#x4EE3;&#x5668;&#x6A21;&#x5F0F;-iterator-pattern-&#x3001;&#x6E38;&#x6807;&#x6A21;&#x5F0F;" class="anchor-navigation-ex-anchor" href="#&#x8FED;&#x4EE3;&#x5668;&#x6A21;&#x5F0F;-iterator-pattern-&#x3001;&#x6E38;&#x6807;&#x6A21;&#x5F0F;"><i class="fa fa-link" aria-hidden="true"></i></a>26. &#x8FED;&#x4EE3;&#x5668;&#x6A21;&#x5F0F; Iterator Pattern &#x3001;&#x6E38;&#x6807;&#x6A21;&#x5F0F;</h1>
<pre><code class="lang-text">&#x8FED;&#x4EE3;&#x5668;&#x6A21;&#x5F0F; &#x63D0;&#x4F9B;&#x4E00;&#x79CD;&#x673A;&#x5236; &#x904D;&#x5386;&#x4E00;&#x4E2A;&#x805A;&#x5408;&#x5BF9;&#x8C61;&#x4E2D;&#x7684;&#x5404;&#x4E2A;&#x5143;&#x7D20;&#xFF0C;&#x800C;&#x53C8;&#x4E0D;&#x66B4;&#x9732;&#x5176;&#x4ED6;&#x7EC6;&#x8282;&#x3002; 

&#x7531;&#x4E8E;java&#x5DF2;&#x7ECF;&#x4E3A;&#x6211;&#x4EEC;&#x5BF9;&#x5BB9;&#x5668;&#x5BF9;&#x8C61;&#xFF08;Collection&#xFF0C;List&#x3001;Set&#x3001;Map&#x7B49;&#xFF09;&#x505A;&#x4E86;&#x5F88;&#x597D;&#x7684;&#x5C01;&#x88C5;&#xFF0C;
&#x6211;&#x4EEC;&#x5E73;&#x65F6;&#x5176;&#x5B9E;&#x5F88;&#x5C11;&#x4F1A;&#x81EA;&#x5DF1;&#x5B9E;&#x73B0;&#x8FED;&#x4EE3;&#x5668;&#x6A21;&#x5F0F;&#x3002;
</code></pre>
<h2 id="demo_10"><a name="demo_10" class="anchor-navigation-ex-anchor" href="#demo_10"><i class="fa fa-link" aria-hidden="true"></i></a>26.1. demo</h2>
<pre><code class="lang-text">// &#x5177;&#x4F53;&#x8FED;&#x4EE3;&#x5668;    
class ConcreteIterator implements MyIterator{  
    private List  list = new ArrayList ();  
    private int cursor =0;  
    public ConcreteIterator(List list){  
        this.list = list;  
    }  
    public boolean hasNext(){
        return !(cursor == list.size());
    }
    public Object next(){  
        if(hasNext()){  
           return list.get(cursor++);  
        }  
        return null;  
    }  
}

/**&#x5177;&#x4F53;&#x7684;&#x805A;&#x5408;&#x7C7B;*/
class ConcreteAggregate {  
    private List  list = new ArrayList();  
    public MyIterator iterator(){  
        return new ConcreteIterator(list);  
    }  
   //  &#x805A;&#x5408;&#x7C7B;&#x4E2D;&#x7684;&#x5176;&#x4ED6;&#x65B9;&#x6CD5; &#xFF0C;&#x5904;&#x7406;&#x5176;&#x4ED6;&#x903B;&#x8F91; fun1 &#x3001;saveObj &#x3001;removeObj
    public void saveObj(Object obj)
    { ...  }
     ... &#x5176;&#x4ED6;&#x903B;&#x8F91;...
}

//&#x4F7F;&#x7528;
// &#x805A;&#x5408;&#x7C7B;
ConcreteAggregate ag = new ConcreteAggregate();  
ag.saveObj(&quot;obj1&quot;);  
ag.saveObj(&quot;obj2&quot;);  

// &#x83B7;&#x53D6;&#x8FED;&#x4EE3;&#x5668;
MyIterator it = ag.iterator();  
//&#x6839;&#x636E;&#x8FED;&#x4EE3;&#x5668; &#x904D;&#x5386;
while(it.hasNext()){ ...  }
</code></pre>
<h2 id="&#x4F18;&#x7F3A;&#x70B9;_9"><a name="&#x4F18;&#x7F3A;&#x70B9;_9" class="anchor-navigation-ex-anchor" href="#&#x4F18;&#x7F3A;&#x70B9;_9"><i class="fa fa-link" aria-hidden="true"></i></a>26.2. &#x4F18;&#x7F3A;&#x70B9;</h2>
<pre><code class="lang-text">// &#x4F18;&#x70B9;
1&#x3001;&#x5C06;&#x805A;&#x5408;&#x7C7B; &#x7684; &#x201C;&#x6570;&#x636E;&#x5B58;&#x50A8;&#x201D; &#x548C; &quot;&#x6570;&#x636E;&#x904D;&#x5386;&quot; &#x5206;&#x79BB; &#x3002;
2&#x3001;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x8FED;&#x4EE3;&#x5668;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x4E00;&#x4E9B;&#x81EA;&#x5DF1;&#x60F3;&#x8981;&#x7684;&#x904D;&#x5386;&#x6548;&#x679C;&#xFF08;&#x9006;&#x5E8F;&#x904D;&#x5386;&#x3001;&#x53EA;&#x904D;&#x5386;&#x7B26;&#x5408;&#x81EA;&#x5DF1;&#x6307;&#x5B9A;&#x6761;&#x4EF6;&#x7684;&#x5BF9;&#x8C61;&#x7B49;&#xFF09;&#x3002;
// &#x7F3A;&#x70B9;
1&#x3001;&#x4E00;&#x4E2A;&#x5177;&#x4F53;&#x7684;&#x805A;&#x5408;&#x7C7B; &#x5BF9;&#x5E94;&#x4E00;&#x4E2A; &#x8FED;&#x4EE3;&#x5668; &#xFF0C;&#x7565;&#x663E;&#x7E41;&#x7410;&#x3002;
</code></pre>
<h1 id="&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;--adapter-pattern"><a name="&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;--adapter-pattern" class="anchor-navigation-ex-anchor" href="#&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;--adapter-pattern"><i class="fa fa-link" aria-hidden="true"></i></a>27. &#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;  Adapter Pattern</h1>
<pre><code class="lang-text">&#x89E3;&#x51B3;&#x63A5;&#x53E3;&#x4E0D;&#x517C;&#x5BB9;&#x7684;&#x95EE;&#x9898;&#x3002;
A &#x9700;&#x8981; C&#x63A5;&#x53E3;&#xFF0C; &#x4F46;&#x662F;&#x7CFB;&#x7EDF;&#x53EA;&#x63D0;&#x4F9B;&#x4E86;B&#x63A5;&#x53E3;&#x3002;
&#x540C;&#x65F6;, A &#x548C;B &#x90FD;&#x4E0D;&#x60F3;&#x6539;&#x6216;&#x8005;&#x4E0D;&#x80FD;&#x6539;&#x3002;
&#x5982;&#x679C;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;B&#x5C01;&#x88C5;&#x4E00;&#x4E0B;&#xFF0C;&#x6539;&#x6210;C&#x63A5;&#x53E3;&#x7684;&#x89C4;&#x8303;&#x3002;&#x5C31;&#x89E3;&#x51B3;&#x4E86;&#x95EE;&#x9898;&#x3002;

&#x88AB;&#x9002;&#x914D;&#x8005; &#xFF1A;&#x5373;&#x6E90;&#x63A5;&#x53E3; &#x3002;
</code></pre>
<h2 id="&#x4E00;&#x3001;&#x7C7B;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;"><a name="&#x4E00;&#x3001;&#x7C7B;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;" class="anchor-navigation-ex-anchor" href="#&#x4E00;&#x3001;&#x7C7B;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;"><i class="fa fa-link" aria-hidden="true"></i></a>27.1. &#x4E00;&#x3001;&#x7C7B;&#x9002;&#x914D;&#x5668; &#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;</h2>
<p>&#x91C7;&#x7528;&#x7EE7;&#x627F;&#x65B9;&#x6848;&#x3002;</p>
<pre><code class="lang-text">// &#x65E7;&#x63A5;&#x53E3; &#x63D0;&#x4F9B;220V&#x7535;&#x538B;
public class Voltage220 {
    public int output220V() {
        return 220;
    }
}
// &#x7528;&#x6237;&#x9700;&#x8981; 5V&#x7684;&#x7535;&#x538B;
public interface Voltage5{
    int output5V();
}

//&#x65B0;&#x5EFA;&#x9002;&#x914D;&#x5668;
public class VoltageAdapter extends Voltage220 implements Voltage5 {
    @Override
    public int output5V() {
      //&#x83B7;&#x5F97;&#x65E7;&#x63A5;&#x53E3;&#x7684;&#x6570;&#x636E;&#xFF0C; &#x8F6C;&#x6362;&#x6210;&#x7528;&#x6237;&#x9700;&#x8981;&#x7684;&#x6570;&#x636E;
        int src = output220V();
        return src / 44;
    }
}
</code></pre>
<h2 id="&#x4E8C;&#x3001;&#x5BF9;&#x8C61;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x63A8;&#x8350;&#xFF09;"><a name="&#x4E8C;&#x3001;&#x5BF9;&#x8C61;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x63A8;&#x8350;&#xFF09;" class="anchor-navigation-ex-anchor" href="#&#x4E8C;&#x3001;&#x5BF9;&#x8C61;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x63A8;&#x8350;&#xFF09;"><i class="fa fa-link" aria-hidden="true"></i></a>27.2. &#x4E8C;&#x3001;&#x5BF9;&#x8C61;&#x9002;&#x914D;&#x5668; &#xFF08;&#x63A8;&#x8350;&#xFF09;</h2>
<p>&#x91C7;&#x7528;&#x6301;&#x6709;&#x65B9;&#x6848;&#x3002;</p>
<pre><code class="lang-text">// &#x65B0;&#x5EFA;&#x9002;&#x914D;&#x5668;
public class VoltageAdapter2 implements Voltage5 {
    private Voltage220 mVoltage220;
    public VoltageAdapter2(Voltage220 voltage220) {...}
    @Override
    public int output5V() {
        int src = mVoltage220.output220V();
        return src / 44;
    }
}
</code></pre>
<h2 id="&#x4E09;&#x3001;&#x7F3A;&#x7701;&#x9002;&#x914D;&#x5668;-&#x3001;&#x63A5;&#x53E3;&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;&#xFF08;&#x63A8;&#x8350;&#xFF09;"><a name="&#x4E09;&#x3001;&#x7F3A;&#x7701;&#x9002;&#x914D;&#x5668;-&#x3001;&#x63A5;&#x53E3;&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;&#xFF08;&#x63A8;&#x8350;&#xFF09;" class="anchor-navigation-ex-anchor" href="#&#x4E09;&#x3001;&#x7F3A;&#x7701;&#x9002;&#x914D;&#x5668;-&#x3001;&#x63A5;&#x53E3;&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;&#xFF08;&#x63A8;&#x8350;&#xFF09;"><i class="fa fa-link" aria-hidden="true"></i></a>27.3. &#x4E09;&#x3001;&#x7F3A;&#x7701;&#x9002;&#x914D;&#x5668; &#x3001;&#x63A5;&#x53E3;&#x9002;&#x914D;&#x5668;&#x6A21;&#x5F0F;&#xFF08;&#x63A8;&#x8350;&#xFF09;</h2>
<p>&#x539F;&#x63A5;&#x53E3;&#x662F; interface &#x3002;</p>
<pre><code class="lang-text">// &#x539F;&#x63A5;&#x53E3;
public  interface AnimatorPauseListener{
  void onAnimationStart(Animator animation);
  void onAnimationEnd(Animator animation);  
   ...
  void onAnimationResume(Animator animation) ;
}

// &#x65B0;&#x5EFA;&#x9002;&#x914D;&#x5668;
public abstract class AnimatorListenerAdapter implements  
AnimatorListener  {
    @Override
    public void onAnimationEnd(Animator animation){...}
    @Override
    public void onAnimationStart(Animator animation){...}
    @Override
    public void onAnimationResume(Animator animation) {...}
}
// &#x4F7F;&#x7528;
XXX.addListener(new AnimatorListenerAdapter() {
           @Override
           public void onAnimationStart(Animator animation) {
               // &#x91CD;&#x65B0; &#x9700;&#x8981;&#x7684;&#x90A3;&#x4E2A;&#x65B9;&#x6CD5;&#x5C31;&#x884C;&#x3002;
               // &#x800C;&#x4E0D;&#x5FC5; &#x8981;&#x5B9E;&#x73B0; interface &#x4E2D;&#x6240;&#x6709;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x4ECE;&#x800C;&#x7B80;&#x5316;&#x4EE3;&#x7801;
           }
       });
</code></pre>
<h2 id="&#x56DB;&#x3001;&#x53CC;&#x5411;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;"><a name="&#x56DB;&#x3001;&#x53CC;&#x5411;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;" class="anchor-navigation-ex-anchor" href="#&#x56DB;&#x3001;&#x53CC;&#x5411;&#x9002;&#x914D;&#x5668;-&#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;"><i class="fa fa-link" aria-hidden="true"></i></a>27.4. &#x56DB;&#x3001;&#x53CC;&#x5411;&#x9002;&#x914D;&#x5668; &#xFF08;&#x4E0D;&#x63A8;&#x8350;&#xFF09;</h2>
<p>&#x540C;&#x65F6;&#x6301;&#x6709;&#x539F;&#x63A5;&#x53E3;&#x548C;&#x65E7;&#x63A5;&#x53E3;&#x7684;&#x5BF9;&#x8C61;&#x3002; </p>
<pre><code class="lang-text">class Adapter implements DesInterface,SrcInterface {  
    private Des des;  
    private Src src;  
    public Adapter(Des des) {... }  
    public Adapter(Src src) {...}  
    public void() func1(){
      src.xxx();
    };
    public void() func2(){
      des.xxx();
    };
}
</code></pre>
<footer class="page-footer"><span class="copyright">( no Copyright&#xFF0C;enjoy youself ! ) all right reserved&#xFF0C;powered by Gitbook</span><span class="footer-modification">The file was updated at :
2022-04-04 10:49:02
</span></footer>
                                
                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                <a href="设计模式.html" class="navigation navigation-prev " aria-label="Previous page: 设计模式">
                    <i class="fa fa-angle-left"></i>
                </a>
                
                
                <a href="mvc等.html" class="navigation navigation-next " aria-label="Next page: mvc等">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"title":"模式详解","level":"1.9.2","depth":2,"next":{"title":"mvc等","level":"1.9.3","depth":2,"path":"chinese/设计模式/mvc等.md","ref":"chinese/设计模式/mvc等.md","articles":[]},"previous":{"title":"设计模式","level":"1.9.1","depth":2,"path":"chinese/设计模式/设计模式.md","ref":"chinese/设计模式/设计模式.md","articles":[]},"dir":"ltr"},"config":{"plugins":["-search","search-plus","todo","anchor-navigation-ex","copy-code-button","fontsettings","tbfed-pagefooter","local-video","splitter","expandable-chapters","favicon","theme-comscore","local-video"],"styles":{"website":"styles/website.css"},"pluginsConfig":{"tbfed-pagefooter":{"copyright":"( no Copyright，enjoy youself ! )","modify_label":"The file was updated at :","modify_format":"YYYY-MM-DD HH:mm:ss"},"todo":{},"splitter":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"fontsettings":{"family":"sans","size":2,"theme":"white"},"highlight":{},"anchor-navigation-ex":{"associatedWithSummary":true,"float":{"floatIcon":"fa fa-navicon","level1Icon":"","level2Icon":"","level3Icon":"","showLevelIcon":false},"mode":"float","multipleH1":true,"pageTop":{"level1Icon":"","level2Icon":"","level3Icon":"","showLevelIcon":false},"printLog":false,"showGoTop":true,"showLevel":true},"favicon":{"shortcut":"assets/images/favicon.ico","bookmark":"assets/images/favicon.ico"},"theme-comscore":{},"local-video":{},"copy-code-button":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false},"expandable-chapters":{},"search-plus":{}},"theme":"default","author":"Aivin","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"Aivin开发笔记","language":"zh-hans","gitbook":"*","description":"Aivin开发笔记"},"file":{"path":"chinese/设计模式/模式详解.md","mtime":"2022-04-04T02:49:02.906Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2022-04-04T03:47:09.782Z"},"basePath":"../..","book":{"language":""}});
        });
    </script>
</div>

        
    <script src="../../gitbook/gitbook.js"></script>
    <script src="../../gitbook/theme.js"></script>
    
        
        <script src="../../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-search-plus/search.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-copy-code-button/toggle.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-local-video/video.min.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-splitter/splitter.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-expandable-chapters/expandable-chapters.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-sharing/buttons.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-theme-comscore/test.js"></script>
        
    

    </body>
</html>

